home *** CD-ROM | disk | FTP | other *** search
/ Apple WWDC 1996 / WWDC96_1996 (CD).toast / Technology Materials / QuickTime VR / MacOS / QuickDraw™ 3D 1.0.6F4 SDK / Development / 3DMF parser / 0.9 version / MFPRIMTV.C < prev    next >
Encoding:
C/C++ Source or Header  |  1995-05-24  |  86.6 KB  |  3,571 lines  |  [TEXT/MPS ]

  1. /*==============================================================================
  2.  *
  3.  *    File:        MFPRIMTV.C
  4.  *
  5.  *    Function:    Handle read/write of basic types.
  6.  *
  7.  *    Author(s):    Rick Wong (RWW), Duet Development Corp.
  8.  *
  9.  *    Copyright:    (c) 1995 by Apple Computer, Inc., all rights reserved.
  10.  *
  11.  *    Change History (most recent first):
  12.  *        Fabio    Changed file name to 8 characters
  13.  *        F3F_RWW Disable variable unsigned read/write.
  14.  *        F3A_RWW    TOC stuff works.
  15.  *        F2S_RWW    BeginGroup changes.
  16.  *        F2R_RWW    Get rid of dumb curPos field in MF3D_FileRec
  17.  *        F2E_RWW    File created.
  18.  *==============================================================================
  19.  */
  20.  
  21. #include "MFPRIMTV.H"
  22.  
  23. #include <stdio.h>            /* sprintf */
  24.  
  25. #include "MF3D.H"
  26. #include "MFERRORS.H"
  27. #include "MFINT64.H"
  28. #include "MFSYSTYP.H"
  29. #include "MFTYPES.H"
  30. #include "MFASSERT.H"
  31. #include "MFBINRD.H"
  32. #include "MFBINUTL.H"
  33. #include "MFINTOBJ.H"
  34. #include "MFLABELS.H"
  35. #include "MFMACROS.H"
  36. #include "MFMEMORY.H"
  37. #include "MFOBJTYP.H"
  38. #include "MFTEXTRD.H"
  39. #include "MFTEXTST.H"
  40. #include "MFTEXTUT.H"
  41. #include "MFTEXTWR.H"
  42.  
  43. /*==============================================================================
  44.  *    Methods structure
  45.  *==============================================================================
  46.  */
  47. struct MF3D_IOPrimitiveMethods
  48. {    /* unsigned integers */
  49.     MF3DErr        (*readUns8)        (MF3D_FilePtr metafile, MF3DUns8 *data);
  50.     MF3DErr        (*writeUns8)    (MF3D_FilePtr metafile, const MF3DUns8 data);
  51.     MF3DErr        (*readUns16)    (MF3D_FilePtr metafile, MF3DUns16 *data);
  52.     MF3DErr        (*writeUns16)    (MF3D_FilePtr metafile, const MF3DUns16 data);
  53.     MF3DErr        (*readUns32)    (MF3D_FilePtr metafile, MF3DUns32 *data);
  54.     MF3DErr        (*writeUns32)    (MF3D_FilePtr metafile, const MF3DUns32 data);
  55.     MF3DErr        (*readUns64)    (MF3D_FilePtr metafile, MF3DUns64 *data);
  56.     MF3DErr        (*writeUns64)    (MF3D_FilePtr metafile, const MF3DUns64 data);
  57.  
  58.     /* signed integers */
  59.     MF3DErr        (*readInt8)        (MF3D_FilePtr metafile, MF3DInt8 *data);
  60.     MF3DErr        (*writeInt8)    (MF3D_FilePtr metafile, const MF3DInt8 data);
  61.     MF3DErr        (*readInt16)    (MF3D_FilePtr metafile, MF3DInt16 *data);
  62.     MF3DErr        (*writeInt16)    (MF3D_FilePtr metafile, const MF3DInt16 data);
  63.     MF3DErr        (*readInt32)    (MF3D_FilePtr metafile, MF3DInt32 *data);
  64.     MF3DErr        (*writeInt32)    (MF3D_FilePtr metafile, const MF3DInt32 data);
  65.     MF3DErr        (*readInt64)    (MF3D_FilePtr metafile, MFINT64 *data);
  66.     MF3DErr        (*writeInt64)    (MF3D_FilePtr metafile, const MFINT64 data);
  67.  
  68.     /* floats */
  69.     MF3DErr        (*readFloat32)    (MF3D_FilePtr metafile, MF3DFloat32 *data);
  70.     MF3DErr        (*writeFloat32)    (MF3D_FilePtr metafile, const MF3DFloat32 data);
  71.     MF3DErr        (*readFloat64)    (MF3D_FilePtr metafile, MF3DFloat64 *data);
  72.     MF3DErr        (*writeFloat64)    (MF3D_FilePtr metafile, const MF3DFloat64 data);
  73.  
  74.     /* strings */
  75.     MF3DErr        (*readCString)    (MF3D_FilePtr metafile, MF3DCStringPtr *data);
  76.     MF3DErr        (*writeCString)    (MF3D_FilePtr metafile, MF3DCStringPtr data);
  77.  
  78.     /* raw data */
  79.     MF3DErr        (*readRawData)    (MF3D_FilePtr metafile, MF3DSize size,
  80.                                         MF3DRawDataPtr data);
  81.     MF3DErr        (*writeRawData)    (MF3D_FilePtr metafile, MF3DSize size,
  82.                                         MF3DRawDataPtr data);
  83.     
  84.     /* enums */
  85.     MF3DErr        (*readEnum)        (MF3D_FilePtr metafile,
  86.                                         MF3D_EnumTablePtr labelID,
  87.                                         MF3DEnumData *data);
  88.     MF3DErr        (*writeEnum)    (MF3D_FilePtr metafile,
  89.                                         MF3D_EnumTablePtr labelID,
  90.                                         MF3DEnumData data);
  91.  
  92.     /* flags */
  93.     MF3DErr        (*readFlags)    (MF3D_FilePtr metafile,
  94.                                         MF3D_FlagTablePtr labelID,
  95.                                         MF3DFlagData *data);
  96.     MF3DErr        (*writeFlags)    (MF3D_FilePtr metafile,
  97.                                         MF3D_FlagTablePtr labelID,
  98.                                         MF3DFlagData data);
  99.  
  100.     /* begin/end object */
  101.     MF3DErr        (*readBegin)    (MF3D_FilePtr metafile,
  102.                                         MF3D_ObjStuffPtr *objStuff,
  103.                                         MF3DReferenceID    *refID,
  104.                                         MF3DObjType *objType);
  105.     MF3DErr        (*readEnd)        (MF3D_FilePtr metafile);
  106.     MF3DErr        (*writeBegin)    (MF3D_FilePtr metafile,
  107.                                         MF3DVoidObjPtr object,
  108.                                         MF3D_ObjStuffPtr *objStuff);
  109.     MF3DErr        (*writeEnd)        (MF3D_FilePtr metafile);
  110.  
  111.     /* object ID */
  112.     MF3DErr        (*readObjType)    (MF3D_FilePtr metafile,
  113.                                         MF3D_ObjStuffPtr *objStuff,
  114.                                         MF3DObjType *objType);
  115.     MF3DErr        (*writeObjType)    (MF3D_FilePtr metafile, MF3DVoidObjPtr object,
  116.                                         MF3D_ObjStuffPtr *objStuff);
  117.  
  118.     /* Reference label */
  119.     MF3DErr        (*readRef)        (MF3D_FilePtr metafile,
  120.                                         MF3DPositionReference *data);
  121.     MF3DErr        (*writeRef)        (MF3D_FilePtr metafile,
  122.                                         MF3D_TOCPosition data);
  123.     MF3DErr        (*writeTOCRef)    (MF3D_FilePtr metafile,
  124.                                         MF3DPositionReferencePtr data);
  125.     MF3DErr        (*writeLabel)    (MF3D_FilePtr metafile,
  126.                                         MF3DReferenceInfoPtr data,
  127.                                         MF3DBinaryFilePosition location,
  128.                                         MF3DObjType type);
  129.  
  130.     /* Preprocess */
  131.     MF3DErr        (*preprocess)    (MF3D_FilePtr metafile);
  132.  
  133.     /* Get Reference Name */
  134.     MF3DCStringPtr    (*getRefName)(MF3D_FilePtr metafile, MF3DReferenceID refID);
  135.  
  136.     /* Postprocess */
  137.     MF3DErr        (*postprocess)    (MF3D_FilePtr metafile);
  138. };
  139.  
  140. typedef struct MF3D_IOPrimitiveMethods    MF3D_IOPrimitiveMethods;
  141.  
  142. /*==============================================================================
  143.  *    Static prototypes
  144.  *==============================================================================
  145.  */
  146. /* unsigned integers */
  147. static MF3DErr    MF3D_Uns8ReadB        (MF3D_FilePtr metafile, MF3DUns8 *data);
  148. static MF3DErr    MF3D_Uns8ReadT        (MF3D_FilePtr metafile, MF3DUns8 *data);
  149.  
  150. static MF3DErr    MF3D_Uns8WriteB        (MF3D_FilePtr metafile, MF3DUns8 data);
  151. static MF3DErr    MF3D_Uns8WriteT        (MF3D_FilePtr metafile, MF3DUns8 data);
  152.  
  153. static MF3DErr    MF3D_Uns16ReadB        (MF3D_FilePtr metafile, MF3DUns16 *data);
  154. static MF3DErr    MF3D_Uns16ReadBS    (MF3D_FilePtr metafile, MF3DUns16 *data);
  155. static MF3DErr    MF3D_Uns16ReadT        (MF3D_FilePtr metafile, MF3DUns16 *data);
  156.  
  157. static MF3DErr    MF3D_Uns16WriteB    (MF3D_FilePtr metafile, MF3DUns16 data);
  158. static MF3DErr    MF3D_Uns16WriteBS    (MF3D_FilePtr metafile, MF3DUns16 data);
  159. static MF3DErr    MF3D_Uns16WriteT    (MF3D_FilePtr metafile, MF3DUns16 data);
  160.  
  161. static MF3DErr    MF3D_Uns32ReadB        (MF3D_FilePtr metafile, MF3DUns32 *data);
  162. static MF3DErr    MF3D_Uns32ReadBS    (MF3D_FilePtr metafile, MF3DUns32 *data);
  163. static MF3DErr    MF3D_Uns32ReadT        (MF3D_FilePtr metafile, MF3DUns32 *data);
  164.  
  165. static MF3DErr    MF3D_Uns32WriteB    (MF3D_FilePtr metafile, MF3DUns32 data);
  166. static MF3DErr    MF3D_Uns32WriteBS    (MF3D_FilePtr metafile, MF3DUns32 data);
  167. static MF3DErr    MF3D_Uns32WriteT    (MF3D_FilePtr metafile, MF3DUns32 data);
  168.  
  169. static MF3DErr    MF3D_Uns64ReadB        (MF3D_FilePtr metafile, MF3DUns64 *data);
  170. static MF3DErr    MF3D_Uns64ReadBS    (MF3D_FilePtr metafile, MF3DUns64 *data);
  171. static MF3DErr    MF3D_Uns64ReadT        (MF3D_FilePtr metafile, MF3DUns64 *data);
  172.  
  173. static MF3DErr    MF3D_Uns64WriteB    (MF3D_FilePtr metafile, MF3DUns64 data);
  174. static MF3DErr    MF3D_Uns64WriteBS    (MF3D_FilePtr metafile, MF3DUns64 data);
  175. static MF3DErr    MF3D_Uns64WriteT    (MF3D_FilePtr metafile, MF3DUns64 data);
  176.  
  177. static MF3DErr    MF3D_Int8ReadB        (MF3D_FilePtr metafile, MF3DInt8 *data);
  178. static MF3DErr    MF3D_Int8ReadT        (MF3D_FilePtr metafile, MF3DInt8 *data);
  179.  
  180. static MF3DErr    MF3D_Int8WriteB        (MF3D_FilePtr metafile, MF3DInt8 data);
  181. static MF3DErr    MF3D_Int8WriteT        (MF3D_FilePtr metafile, MF3DInt8 data);
  182.  
  183. static MF3DErr    MF3D_Int16ReadB        (MF3D_FilePtr metafile, MF3DInt16 *data);
  184. static MF3DErr    MF3D_Int16ReadBS    (MF3D_FilePtr metafile, MF3DInt16 *data);
  185. static MF3DErr    MF3D_Int16ReadT        (MF3D_FilePtr metafile, MF3DInt16 *data);
  186.  
  187. static MF3DErr    MF3D_Int16WriteB    (MF3D_FilePtr metafile, MF3DInt16 data);
  188. static MF3DErr    MF3D_Int16WriteBS    (MF3D_FilePtr metafile, MF3DInt16 data);
  189. static MF3DErr    MF3D_Int16WriteT    (MF3D_FilePtr metafile, MF3DInt16 data);
  190.  
  191. static MF3DErr    MF3D_Int32ReadB        (MF3D_FilePtr metafile, MF3DInt32 *data);
  192. static MF3DErr    MF3D_Int32ReadBS    (MF3D_FilePtr metafile, MF3DInt32 *data);
  193. static MF3DErr    MF3D_Int32ReadT        (MF3D_FilePtr metafile, MF3DInt32 *data);
  194.  
  195. static MF3DErr    MF3D_Int32WriteB    (MF3D_FilePtr metafile, MF3DInt32 data);
  196. static MF3DErr    MF3D_Int32WriteBS    (MF3D_FilePtr metafile, MF3DInt32 data);
  197. static MF3DErr    MF3D_Int32WriteT    (MF3D_FilePtr metafile, MF3DInt32 data);
  198.  
  199. static MF3DErr    MF3D_Int64ReadB        (MF3D_FilePtr metafile, MFINT64 *data);
  200. static MF3DErr    MF3D_Int64ReadBS    (MF3D_FilePtr metafile, MFINT64 *data);
  201. static MF3DErr    MF3D_Int64ReadT        (MF3D_FilePtr metafile, MFINT64 *data);
  202.  
  203. static MF3DErr    MF3D_Int64WriteB    (MF3D_FilePtr metafile, MFINT64 data);
  204. static MF3DErr    MF3D_Int64WriteBS    (MF3D_FilePtr metafile, MFINT64 data);
  205. static MF3DErr    MF3D_Int64WriteT    (MF3D_FilePtr metafile, MFINT64 data);
  206.  
  207. /* floats */
  208. static MF3DErr    MF3D_Float32ReadB    (MF3D_FilePtr metafile, MF3DFloat32 *data);
  209. static MF3DErr    MF3D_Float32ReadBS    (MF3D_FilePtr metafile, MF3DFloat32 *data);
  210. static MF3DErr    MF3D_Float32ReadT    (MF3D_FilePtr metafile, MF3DFloat32 *data);
  211.  
  212. static MF3DErr    MF3D_Float32WriteB    (MF3D_FilePtr metafile, MF3DFloat32 data);
  213. static MF3DErr    MF3D_Float32WriteBS    (MF3D_FilePtr metafile, MF3DFloat32 data);
  214. static MF3DErr    MF3D_Float32WriteT    (MF3D_FilePtr metafile, MF3DFloat32 data);
  215.  
  216. static MF3DErr    MF3D_Float64ReadB    (MF3D_FilePtr metafile, MF3DFloat64 *data);
  217. static MF3DErr    MF3D_Float64ReadBS    (MF3D_FilePtr metafile, MF3DFloat64 *data);
  218. static MF3DErr    MF3D_Float64ReadT    (MF3D_FilePtr metafile, MF3DFloat64 *data);
  219.  
  220. static MF3DErr    MF3D_Float64WriteB    (MF3D_FilePtr metafile, MF3DFloat64 data);
  221. static MF3DErr    MF3D_Float64WriteBS    (MF3D_FilePtr metafile, MF3DFloat64 data);
  222. static MF3DErr    MF3D_Float64WriteT    (MF3D_FilePtr metafile, MF3DFloat64 data);
  223.  
  224. /* strings */
  225. static MF3DErr    MF3D_CStringReadB    (MF3D_FilePtr metafile, MF3DCStringPtr *data);
  226. static MF3DErr    MF3D_CStringReadT    (MF3D_FilePtr metafile, MF3DCStringPtr *data);
  227.  
  228. static MF3DErr    MF3D_CStringWriteB    (MF3D_FilePtr metafile, MF3DCStringPtr data);
  229. static MF3DErr    MF3D_CStringWriteT    (MF3D_FilePtr metafile, MF3DCStringPtr data);
  230.  
  231. /* raw data */
  232. static MF3DErr    MF3D_RawDataReadB    (MF3D_FilePtr metafile, MF3DSize size,
  233.                                             MF3DRawDataPtr data);
  234. static MF3DErr    MF3D_RawDataReadT    (MF3D_FilePtr metafile, MF3DSize size,
  235.                                             MF3DRawDataPtr data);
  236.  
  237. static MF3DErr    MF3D_RawDataWriteB    (MF3D_FilePtr metafile, MF3DSize size,
  238.                                         MF3DRawDataPtr data);
  239. static MF3DErr    MF3D_RawDataWriteT    (MF3D_FilePtr metafile, MF3DSize size,
  240.                                         MF3DRawDataPtr data);
  241.     
  242. /* enums */
  243. static MF3DErr    MF3D_EnumReadB        (MF3D_FilePtr metafile,
  244.                                             MF3D_EnumTablePtr labelID,
  245.                                             MF3DEnumData *data);
  246. static MF3DErr    MF3D_EnumReadBS        (MF3D_FilePtr metafile,
  247.                                             MF3D_EnumTablePtr labelID,
  248.                                             MF3DEnumData *data);
  249. static MF3DErr    MF3D_EnumReadT        (MF3D_FilePtr metafile,
  250.                                             MF3D_EnumTablePtr labelID,
  251.                                             MF3DEnumData *data);
  252.  
  253. static MF3DErr    MF3D_EnumWriteB        (MF3D_FilePtr metafile,
  254.                                             MF3D_EnumTablePtr labelID,
  255.                                             MF3DEnumData data);
  256. static MF3DErr    MF3D_EnumWriteBS    (MF3D_FilePtr metafile,
  257.                                             MF3D_EnumTablePtr labelID,
  258.                                             MF3DEnumData data);
  259. static MF3DErr    MF3D_EnumWriteT        (MF3D_FilePtr metafile,
  260.                                             MF3D_EnumTablePtr labelID,
  261.                                             MF3DEnumData data);
  262.  
  263. /* flags */
  264. static MF3DErr    MF3D_FlagsReadB        (MF3D_FilePtr metafile,
  265.                                             MF3D_FlagTablePtr labelID,
  266.                                             MF3DFlagData *data);
  267. static MF3DErr    MF3D_FlagsReadBS    (MF3D_FilePtr metafile,
  268.                                             MF3D_FlagTablePtr labelID,
  269.                                             MF3DFlagData *data);
  270. static MF3DErr    MF3D_FlagsReadT        (MF3D_FilePtr metafile,
  271.                                             MF3D_FlagTablePtr labelID,
  272.                                             MF3DFlagData *data);
  273.  
  274. static MF3DErr    MF3D_FlagsWriteB    (MF3D_FilePtr metafile,
  275.                                             MF3D_FlagTablePtr labelID,
  276.                                             MF3DFlagData data);
  277. static MF3DErr    MF3D_FlagsWriteBS    (MF3D_FilePtr metafile,
  278.                                             MF3D_FlagTablePtr labelID,
  279.                                             MF3DFlagData data);
  280. static MF3DErr    MF3D_FlagsWriteT    (MF3D_FilePtr metafile,
  281.                                             MF3D_FlagTablePtr labelID,
  282.                                             MF3DFlagData data);
  283.  
  284. /* begin/end object */
  285. static MF3DErr    MF3D_BeginReadB        (MF3D_FilePtr metafile,
  286.                                             MF3D_ObjStuffPtr *objStuff,
  287.                                             MF3DReferenceID    *refID,
  288.                                             MF3DObjType *objType);
  289. static MF3DErr    MF3D_BeginReadT        (MF3D_FilePtr metafile,
  290.                                             MF3D_ObjStuffPtr *objStuff,
  291.                                             MF3DReferenceID    *refID,
  292.                                             MF3DObjType *objType);
  293.  
  294. static MF3DErr    MF3D_EndReadB        (MF3D_FilePtr metafile);
  295. static MF3DErr    MF3D_EndReadBS        (MF3D_FilePtr metafile);
  296. static MF3DErr    MF3D_EndReadT        (MF3D_FilePtr metafile);
  297.  
  298. static MF3DErr    MF3D_BeginWriteB    (MF3D_FilePtr metafile,
  299.                                             MF3DVoidObjPtr object,
  300.                                             MF3D_ObjStuffPtr *objStuff);
  301. static MF3DErr    MF3D_BeginWriteT    (MF3D_FilePtr metafile,
  302.                                             MF3DVoidObjPtr object,
  303.                                             MF3D_ObjStuffPtr *objStuff);
  304.  
  305. static MF3DErr    MF3D_EndWriteB        (MF3D_FilePtr metafile);
  306. static MF3DErr    MF3D_EndWriteT        (MF3D_FilePtr metafile);
  307.  
  308. /* object ID */
  309. static MF3DErr    MF3D_ObjTypeReadB    (MF3D_FilePtr metafile,
  310.                                             MF3D_ObjStuffPtr *objStuff,
  311.                                             MF3DObjType *objType);
  312. static MF3DErr    MF3D_ObjTypeReadBS    (MF3D_FilePtr metafile,
  313.                                             MF3D_ObjStuffPtr *objStuff,
  314.                                             MF3DObjType *objType);
  315. static MF3DErr    MF3D_ObjTypeReadT    (MF3D_FilePtr metafile,
  316.                                             MF3D_ObjStuffPtr *objStuff,
  317.                                             MF3DObjType *objType);
  318.  
  319. static MF3DErr    MF3D_ObjTypeWriteB    (MF3D_FilePtr metafile,
  320.                                             MF3DVoidObjPtr object,
  321.                                             MF3D_ObjStuffPtr *objStuff);
  322. static MF3DErr    MF3D_ObjTypeWriteT    (MF3D_FilePtr metafile,
  323.                                             MF3DVoidObjPtr object,
  324.                                             MF3D_ObjStuffPtr *objStuff);
  325.  
  326. /* reference label */
  327. static MF3DErr    MF3D_RefReadB        (MF3D_FilePtr metafile,
  328.                                             MF3DPositionReference *data);
  329. static MF3DErr    MF3D_RefReadT        (MF3D_FilePtr metafile,
  330.                                             MF3DPositionReference *data);
  331.  
  332. static MF3DErr    MF3D_RefWriteB        (MF3D_FilePtr metafile,
  333.                                             MF3D_TOCPosition data);
  334. static MF3DErr    MF3D_RefWriteT        (MF3D_FilePtr metafile,
  335.                                             MF3D_TOCPosition data);
  336.  
  337. static MF3DErr    MF3D_TOCRefWriteB    (MF3D_FilePtr metafile,
  338.                                             MF3DPositionReferencePtr data);
  339. static MF3DErr    MF3D_TOCRefWriteT    (MF3D_FilePtr metafile,
  340.                                             MF3DPositionReferencePtr data);
  341.  
  342. static MF3DErr    MF3D_LabelWriteB    (MF3D_FilePtr metafile,
  343.                                             MF3DReferenceInfoPtr data,
  344.                                             MF3DBinaryFilePosition location,
  345.                                             MF3DObjType type);
  346. static MF3DErr    MF3D_LabelWriteT    (MF3D_FilePtr metafile,
  347.                                             MF3DReferenceInfoPtr data,
  348.                                             MF3DBinaryFilePosition location,
  349.                                             MF3DObjType type);
  350.  
  351. /*==============================================================================
  352.  *    Static Globals
  353.  *==============================================================================
  354.  */
  355. static MF3D_IOPrimitiveMethods    gMF3D_BinaryPrimitiveMethods =
  356. {    /* integers */
  357.     MF3D_Uns8ReadB,
  358.     MF3D_Uns8WriteB,
  359.     MF3D_Uns16ReadB,
  360.     MF3D_Uns16WriteB,
  361.     MF3D_Uns32ReadB,
  362.     MF3D_Uns32WriteB,
  363.     MF3D_Uns64ReadB,
  364.     MF3D_Uns64WriteB,
  365.     MF3D_Int8ReadB,
  366.     MF3D_Int8WriteB,
  367.     MF3D_Int16ReadB,
  368.     MF3D_Int16WriteB,
  369.     MF3D_Int32ReadB,
  370.     MF3D_Int32WriteB,
  371.     MF3D_Int64ReadB,
  372.     MF3D_Int64WriteB,
  373.     /* floats */
  374.     MF3D_Float32ReadB,
  375.     MF3D_Float32WriteB,
  376.     MF3D_Float64ReadB,
  377.     MF3D_Float64WriteB,
  378.     /* strings */
  379.     MF3D_CStringReadB,
  380.     MF3D_CStringWriteB,
  381.     /* raw data */
  382.     MF3D_RawDataReadB,
  383.     MF3D_RawDataWriteB,
  384.     /* enums */
  385.     MF3D_EnumReadB,
  386.     MF3D_EnumWriteB,
  387.     /* flags */
  388.     MF3D_FlagsReadB,
  389.     MF3D_FlagsWriteB,
  390.     /* begin/end (size) */
  391.     MF3D_BeginReadB,
  392.     MF3D_EndReadB,
  393.     MF3D_BeginWriteB,
  394.     MF3D_EndWriteB,
  395.     /* object id */
  396.     MF3D_ObjTypeReadB,
  397.     MF3D_ObjTypeWriteB,
  398.     /* reference */
  399.     MF3D_RefReadB,
  400.     MF3D_RefWriteB,
  401.     MF3D_TOCRefWriteB,
  402.     MF3D_LabelWriteB,
  403.     /* preprocess */
  404.     MF3D_PreprocessBinaryFile,
  405.     /* get reference name */
  406.     MF3D_GetRefNameB,
  407.     /* postprocess */
  408.     MF3D_PostprocessBinaryFile
  409. };
  410.  
  411. static MF3D_IOPrimitiveMethods    gMF3D_BinarySwappedPrimitiveMethods =
  412. {    /* integers */
  413.     MF3D_Uns8ReadB,
  414.     MF3D_Uns8WriteB,
  415.     MF3D_Uns16ReadBS,
  416.     MF3D_Uns16WriteBS,
  417.     MF3D_Uns32ReadBS,
  418.     MF3D_Uns32WriteBS,
  419.     MF3D_Uns64ReadBS,
  420.     MF3D_Uns64WriteBS,
  421.     MF3D_Int8ReadB,
  422.     MF3D_Int8WriteB,
  423.     MF3D_Int16ReadBS,
  424.     MF3D_Int16WriteBS,
  425.     MF3D_Int32ReadBS,
  426.     MF3D_Int32WriteBS,
  427.     MF3D_Int64ReadBS,
  428.     MF3D_Int64WriteBS,
  429.     /* floats */
  430.     MF3D_Float32ReadBS,
  431.     MF3D_Float32WriteBS,
  432.     MF3D_Float64ReadBS,
  433.     MF3D_Float64WriteBS,
  434.     /* strings */
  435.     MF3D_CStringReadB,
  436.     MF3D_CStringWriteB,
  437.     /* raw data */
  438.     MF3D_RawDataReadB,
  439.     MF3D_RawDataWriteB,
  440.     /* enums */
  441.     MF3D_EnumReadBS,
  442.     MF3D_EnumWriteBS,
  443.     /* flags */
  444.     MF3D_FlagsReadBS,
  445.     MF3D_FlagsWriteBS,
  446.     /* begin/end (size) */
  447.     MF3D_BeginReadB,
  448.     MF3D_EndReadB,
  449.     MF3D_BeginWriteB,
  450.     MF3D_EndWriteB,
  451.     /* object id */
  452.     MF3D_ObjTypeReadBS,
  453.     MF3D_ObjTypeWriteB,
  454.     /* reference */
  455.     MF3D_RefReadB,
  456.     MF3D_RefWriteB,
  457.     MF3D_TOCRefWriteB,
  458.     MF3D_LabelWriteB,
  459.     /* preprocess */
  460.     MF3D_PreprocessBinaryFile,
  461.     /* get reference name */
  462.     MF3D_GetRefNameB,
  463.     /* postprocess */
  464.     MF3D_PostprocessBinaryFile
  465. };
  466.  
  467. static MF3D_IOPrimitiveMethods    gMF3D_TextPrimitiveMethods =
  468. {    /* integers */
  469.     MF3D_Uns8ReadT,
  470.     MF3D_Uns8WriteT,
  471.     MF3D_Uns16ReadT,
  472.     MF3D_Uns16WriteT,
  473.     MF3D_Uns32ReadT,
  474.     MF3D_Uns32WriteT,
  475.     MF3D_Uns64ReadT,
  476.     MF3D_Uns64WriteT,
  477.     MF3D_Int8ReadT,
  478.     MF3D_Int8WriteT,
  479.     MF3D_Int16ReadT,
  480.     MF3D_Int16WriteT,
  481.     MF3D_Int32ReadT,
  482.     MF3D_Int32WriteT,
  483.     MF3D_Int64ReadT,
  484.     MF3D_Int64WriteT,
  485.     /* floats */
  486.     MF3D_Float32ReadT,
  487.     MF3D_Float32WriteT,
  488.     MF3D_Float64ReadT,
  489.     MF3D_Float64WriteT,
  490.     /* strings */
  491.     MF3D_CStringReadT,
  492.     MF3D_CStringWriteT,
  493.     /* raw data */
  494.     MF3D_RawDataReadT,
  495.     MF3D_RawDataWriteT,
  496.     /* enums */
  497.     MF3D_EnumReadT,
  498.     MF3D_EnumWriteT,
  499.     /* flags */
  500.     MF3D_FlagsReadT,
  501.     MF3D_FlagsWriteT,
  502.     /* begin/end object */
  503.     MF3D_BeginReadT,
  504.     MF3D_EndReadT,
  505.     MF3D_BeginWriteT,
  506.     MF3D_EndWriteT,
  507.     /* object id */
  508.     MF3D_ObjTypeReadT,
  509.     MF3D_ObjTypeWriteT,
  510.     /* reference */
  511.     MF3D_RefReadT,
  512.     MF3D_RefWriteT,
  513.     MF3D_TOCRefWriteT,
  514.     MF3D_LabelWriteT,
  515.     /* preprocess */
  516.     MF3D_PreprocessTextFile,
  517.     /* get reference name */
  518.     MF3D_GetRefNameT,
  519.     /* postprocess */
  520.     MF3D_PostprocessTextFile
  521. };
  522.  
  523. static MF3DUns32    zero = 0;
  524.  
  525. /*==============================================================================
  526.  *    MF3D_GetPrimitivesAccessor
  527.  *==============================================================================
  528.  */
  529. MF3DErr
  530. MF3D_GetPrimitivesAccessor(
  531.     MF3DDataFormatEnum        inDataFormat,
  532.     MF3D_IOPrimitivesTable    *outPrimitives)
  533. {
  534.     switch(inDataFormat)
  535.     {    case kMF3DFormatBinary:
  536.             *outPrimitives = &gMF3D_BinaryPrimitiveMethods;
  537.             break;
  538.  
  539.         case kMF3DFormatSwappedBinary:
  540.             *outPrimitives = &gMF3D_BinarySwappedPrimitiveMethods;
  541.             break;
  542.  
  543.         case kMF3DFormatText:
  544.             *outPrimitives = &gMF3D_TextPrimitiveMethods;
  545.             break;
  546.  
  547.         default:
  548.             return kMF3DErrIllegalDataType;
  549.     }
  550.     return kMF3DNoErr;
  551. }
  552.  
  553. /*==============================================================================
  554.  *    Dispatch Routines
  555.  *    Integers
  556.  *==============================================================================
  557.  */
  558. MF3DErr
  559. MF3D_Uns8Read(
  560.     MF3D_FilePtr    metafile,
  561.     MF3DUns8        *data)
  562. {
  563.     MF3D_ValidateReadSize(metafile, sizeof(MF3DUns8));
  564.     return (*metafile->primitives->readUns8)(metafile, data);
  565. }
  566.  
  567. MF3DErr
  568. MF3D_Uns8Write(
  569.     MF3D_FilePtr    metafile,
  570.     const MF3DUns8    data)
  571. {
  572.     MF3D_ValidateWriteSize(metafile, sizeof(MF3DUns8));
  573.     return (*metafile->primitives->writeUns8)(metafile, data);
  574. }
  575.  
  576. MF3DErr
  577. MF3D_Uns16Read(
  578.     MF3D_FilePtr    metafile,
  579.     MF3DUns16        *data)
  580. {
  581.     MF3D_ValidateReadSize(metafile, sizeof(MF3DUns16));
  582.     return (*metafile->primitives->readUns16)(metafile, data);
  583. }
  584.  
  585. MF3DErr
  586. MF3D_Uns16Write(
  587.     MF3D_FilePtr    metafile,
  588.     const MF3DUns16    data)
  589. {
  590.     MF3D_ValidateWriteSize(metafile, sizeof(MF3DUns16));
  591.     return (*metafile->primitives->writeUns16)(metafile, data);
  592. }
  593.  
  594. MF3DErr
  595. MF3D_Uns32Read(
  596.     MF3D_FilePtr    metafile,
  597.     MF3DUns32        *data)
  598. {
  599.     MF3D_ValidateReadSize(metafile, sizeof(MF3DUns32));
  600.     return (*metafile->primitives->readUns32)(metafile, data);
  601. }
  602.  
  603. MF3DErr
  604. MF3D_Uns32Write(
  605.     MF3D_FilePtr    metafile,
  606.     const MF3DUns32    data)
  607. {
  608.     MF3D_ValidateWriteSize(metafile, sizeof(MF3DUns32));
  609.     return (*metafile->primitives->writeUns32)(metafile, data);
  610. }
  611.  
  612. MF3DErr
  613. MF3D_Uns64Read(
  614.     MF3D_FilePtr    metafile,
  615.     MF3DUns64        *data)
  616. {
  617.     MF3D_ValidateReadSize(metafile, sizeof(MF3DUns64));
  618.     return (*metafile->primitives->readUns64)(metafile, data);
  619. }
  620.  
  621. MF3DErr
  622. MF3D_Uns64Write(
  623.     MF3D_FilePtr    metafile,
  624.     const MF3DUns64    data)
  625. {
  626.     MF3D_ValidateWriteSize(metafile, sizeof(MF3DUns64));
  627.     return (*metafile->primitives->writeUns64)(metafile, data);
  628. }
  629.  
  630. MF3DErr
  631. MF3D_Int8Read(
  632.     MF3D_FilePtr    metafile,
  633.     MF3DInt8        *data)
  634. {
  635.     MF3D_ValidateReadSize(metafile, sizeof(MF3DInt8));
  636.     return (*metafile->primitives->readInt8)(metafile, data);
  637. }
  638.  
  639. MF3DErr
  640. MF3D_Int8Write(
  641.     MF3D_FilePtr    metafile,
  642.     const MF3DInt8    data)
  643. {
  644.     MF3D_ValidateWriteSize(metafile, sizeof(MF3DInt8));
  645.     return (*metafile->primitives->writeInt8)(metafile, data);
  646. }
  647.  
  648. MF3DErr
  649. MF3D_Int16Read(
  650.     MF3D_FilePtr    metafile,
  651.     MF3DInt16        *data)
  652. {
  653.     MF3D_ValidateReadSize(metafile, sizeof(MF3DInt16));
  654.     return (*metafile->primitives->readInt16)(metafile, data);
  655. }
  656.  
  657. MF3DErr
  658. MF3D_Int16Write(
  659.     MF3D_FilePtr    metafile,
  660.     const MF3DInt16    data)
  661. {
  662.     MF3D_ValidateWriteSize(metafile, sizeof(MF3DInt16));
  663.     return (*metafile->primitives->writeInt16)(metafile, data);
  664. }
  665.  
  666. MF3DErr
  667. MF3D_Int32Read(
  668.     MF3D_FilePtr    metafile,
  669.     MF3DInt32        *data)
  670. {
  671.     MF3D_ValidateReadSize(metafile, sizeof(MF3DInt32));
  672.     return (*metafile->primitives->readInt32)(metafile, data);
  673. }
  674.  
  675. MF3DErr
  676. MF3D_Int32Write(
  677.     MF3D_FilePtr    metafile,
  678.     const MF3DInt32    data)
  679. {
  680.     MF3D_ValidateWriteSize(metafile, sizeof(MF3DInt32));
  681.     return (*metafile->primitives->writeInt32)(metafile, data);
  682. }
  683.  
  684. MF3DErr
  685. MF3D_Int64Read(
  686.     MF3D_FilePtr    metafile,
  687.     MFINT64        *data)
  688. {
  689.     MF3D_ValidateReadSize(metafile, sizeof(MFINT64));
  690.     return (*metafile->primitives->readInt64)(metafile, data);
  691. }
  692.  
  693. MF3DErr
  694. MF3D_Int64Write(
  695.     MF3D_FilePtr    metafile,
  696.     const MFINT64    data)
  697. {
  698.     MF3D_ValidateWriteSize(metafile, sizeof(MFINT64));
  699.     return (*metafile->primitives->writeInt64)(metafile, data);
  700. }
  701.  
  702. /*==============================================================================
  703.  *    Dispatch Routines
  704.  *    Floats
  705.  *==============================================================================
  706.  */
  707. MF3DErr
  708. MF3D_Float32Read(
  709.     MF3D_FilePtr    metafile,
  710.     MF3DFloat32        *data)
  711. {
  712.     MF3D_ValidateReadSize(metafile, sizeof(MF3DFloat32));
  713.     return (*metafile->primitives->readFloat32)(metafile, data);
  714. }
  715.  
  716. MF3DErr
  717. MF3D_Float32Write(
  718.     MF3D_FilePtr        metafile,
  719.     const MF3DFloat32    data)
  720. {
  721.     MF3D_ValidateWriteSize(metafile, sizeof(MF3DFloat32));
  722.     return (*metafile->primitives->writeFloat32)(metafile, data);
  723. }
  724.  
  725. MF3DErr
  726. MF3D_Float64Read(
  727.     MF3D_FilePtr    metafile,
  728.     MF3DFloat64        *data)
  729. {
  730.     MF3D_ValidateReadSize(metafile, sizeof(MF3DFloat64));
  731.     return (*metafile->primitives->readFloat64)(metafile, data);
  732. }
  733.  
  734. MF3DErr
  735. MF3D_Float64Write(
  736.     MF3D_FilePtr        metafile,
  737.     const MF3DFloat64    data)
  738. {
  739.     MF3D_ValidateWriteSize(metafile, sizeof(MF3DFloat64));
  740.     return (*metafile->primitives->writeFloat64)(metafile, data);
  741. }
  742.  
  743. /*==============================================================================
  744.  *    Dispatch Routines
  745.  *    Strings
  746.  *==============================================================================
  747.  */
  748. MF3DErr
  749. MF3D_CStringRead(
  750.     MF3D_FilePtr    metafile,
  751.     MF3DCStringPtr    *data)
  752. {
  753.     /* Must do size validation later */
  754.     return (*metafile->primitives->readCString)(metafile, data);
  755. }
  756.  
  757. MF3DErr
  758. MF3D_CStringWrite(
  759.     MF3D_FilePtr    metafile,
  760.     MF3DCStringPtr    data)
  761. {
  762.     /* Do size validation later */
  763.     return (*metafile->primitives->writeCString)(metafile, data);
  764. }
  765.  
  766. /*==============================================================================
  767.  *    Dispatch Routines
  768.  *    Booleans
  769.  *==============================================================================
  770.  */
  771. MF3DErr
  772. MF3D_BooleanRead(
  773.     MF3D_FilePtr    metafile,
  774.     MF3DBoolean        *data)
  775. {
  776.     MF3D_ValidateReadSize(metafile, sizeof(MF3DBoolean));
  777.     return (*metafile->primitives->readEnum)(metafile,
  778.             gMF3D_BooleanEnum, data);
  779. }
  780.  
  781. MF3DErr
  782. MF3D_BooleanWrite(
  783.     MF3D_FilePtr        metafile,
  784.     const MF3DBoolean    data)
  785. {
  786.     MF3D_ValidateWriteSize(metafile, sizeof(MF3DBoolean));
  787.     return (*metafile->primitives->writeEnum)(metafile,
  788.             gMF3D_BooleanEnum, data);
  789. }
  790.  
  791. /*==============================================================================
  792.  *    Dispatch Routines
  793.  *    Raw Data
  794.  *==============================================================================
  795.  */
  796. MF3DErr
  797. MF3D_RawDataRead(
  798.     MF3D_FilePtr    metafile,
  799.     MF3DSize        size,
  800.     MF3DRawDataPtr     data)
  801. {
  802.     MF3D_ValidateReadSize(metafile, size);
  803.     return (*metafile->primitives->readRawData)(metafile, size, data);
  804. }
  805.  
  806. MF3DErr
  807. MF3D_RawDataWrite(
  808.     MF3D_FilePtr    metafile,
  809.     MF3DSize        size,
  810.     MF3DRawDataPtr     data)
  811. {
  812.     MF3D_ValidateWriteSize(metafile, size);
  813.     return (*metafile->primitives->writeRawData)(metafile, size, data);
  814. }
  815.     
  816. /*==============================================================================
  817.  *    Dispatch Routines
  818.  *    Enums
  819.  *==============================================================================
  820.  */
  821. MF3DErr    MF3D_EnumRead(
  822.     MF3D_FilePtr        metafile,
  823.     MF3D_EnumTablePtr    labelID,
  824.     MF3DEnumData        *data)
  825. {
  826.     MF3D_ValidateReadSize(metafile, sizeof(MF3DEnumData));
  827.     return (*metafile->primitives->readEnum)(metafile, labelID, data);
  828. }
  829.  
  830. MF3DErr    MF3D_EnumWrite(
  831.     MF3D_FilePtr        metafile,
  832.     MF3D_EnumTablePtr    labelID,
  833.     const MF3DEnumData    data)
  834. {
  835.     MF3D_ValidateWriteSize(metafile, sizeof(MF3DEnumData));
  836.     return (*metafile->primitives->writeEnum)(metafile, labelID, data);
  837. }
  838.  
  839. /*==============================================================================
  840.  *    Dispatch Routines
  841.  *    Flags
  842.  *==============================================================================
  843.  */
  844. MF3DErr    MF3D_FlagsRead(
  845.     MF3D_FilePtr        metafile,
  846.     MF3D_FlagTablePtr    labelID,
  847.     MF3DFlagData        *data)
  848. {
  849.     MF3D_ValidateReadSize(metafile, sizeof(MF3DFlagData));
  850.     return (*metafile->primitives->readFlags)(metafile, labelID, data);
  851. }
  852.  
  853. MF3DErr    MF3D_FlagsWrite(
  854.     MF3D_FilePtr        metafile,
  855.     MF3D_FlagTablePtr    labelID,
  856.     const MF3DFlagData    data)
  857. {
  858.     MF3D_ValidateWriteSize(metafile, sizeof(MF3DFlagData));
  859.     return (*metafile->primitives->writeFlags)(metafile, labelID, data);
  860. }
  861.  
  862. /*==============================================================================
  863.  *    Dispatch Routines
  864.  *    Begin/End (Size)
  865.  *==============================================================================
  866.  */
  867. MF3DErr
  868. MF3D_BeginRead(
  869.     MF3D_FilePtr        metafile,
  870.     MF3D_ObjStuffPtr    *objStuff,
  871.     MF3DReferenceID        *refID,
  872.     MF3DObjType            *objType)
  873. {
  874.     /* Validate size later */
  875.     return (*metafile->primitives->readBegin)
  876.                     (metafile, objStuff, refID, objType);
  877. }
  878.  
  879. MF3DErr
  880. MF3D_EndRead(
  881.     MF3D_FilePtr    metafile)
  882. {
  883.     /* Validate size later */
  884.     return (*metafile->primitives->readEnd)(metafile);
  885. }
  886.  
  887. MF3DErr
  888. MF3D_BeginWrite(
  889.     MF3D_FilePtr        metafile,
  890.     MF3DVoidObjPtr        object,
  891.     MF3D_ObjStuffPtr    *objStuff)
  892. {
  893.     return (*metafile->primitives->writeBegin) (metafile, object, objStuff);
  894. }
  895.  
  896. MF3DErr
  897. MF3D_EndWrite(
  898.     MF3D_FilePtr    metafile,
  899.     MF3DVoidObjPtr    object)
  900. {
  901.     MF3DErr    result;
  902.  
  903.     result = kMF3DNoErr;
  904.  
  905.     if (object->objectType != kMF3DObjContainer)
  906.         result = (*metafile->primitives->writeEnd)(metafile);
  907.  
  908.     return result;
  909. }
  910.  
  911. /*==============================================================================
  912.  *    Dispatch Routines
  913.  *    Object Type
  914.  *==============================================================================
  915.  */
  916. MF3DErr
  917. MF3D_ObjTypeRead(
  918.     MF3D_FilePtr        metafile,
  919.     MF3D_ObjStuffPtr    *objStuff,
  920.     MF3DObjType            *objType)
  921. {
  922.     return (*metafile->primitives->readObjType)(metafile, objStuff, objType);
  923. }
  924.  
  925. MF3DErr
  926. MF3D_ObjTypeWrite(
  927.     MF3D_FilePtr        metafile,
  928.     MF3DVoidObjPtr        object,
  929.     MF3D_ObjStuffPtr    *objStuff)
  930. {
  931.     return (*metafile->primitives->writeObjType)(metafile, object, objStuff);
  932. }
  933.  
  934. /*==============================================================================
  935.  *    Dispatch Routines
  936.  *    Reference
  937.  *==============================================================================
  938.  */
  939. MF3DErr
  940. MF3D_RefRead(
  941.     MF3D_FilePtr            metafile,
  942.     MF3DPositionReference    *data)
  943. {
  944.     data->format = metafile->dataFormat;
  945.     return (*metafile->primitives->readRef)(metafile, data);
  946. }
  947.  
  948. MF3DErr
  949. MF3D_RefWrite(
  950.     MF3D_FilePtr            metafile,
  951.     MF3D_TOCPosition        data)
  952. {
  953.     return (*metafile->primitives->writeRef)(metafile, data);
  954. }
  955.  
  956. MF3DErr
  957. MF3D_TOCRefWrite(
  958.     MF3D_FilePtr                metafile,
  959.     MF3DPositionReferencePtr    data)
  960. {
  961.     return (*metafile->primitives->writeTOCRef)(metafile, data);
  962. }
  963.  
  964. MF3DErr
  965. MF3D_LabelWrite(
  966.     MF3D_FilePtr                metafile,
  967.     MF3DReferenceInfoPtr        data,
  968.     MF3DBinaryFilePosition        location,
  969.     MF3DObjType                    type)
  970. {
  971.     MF3D_TOCReferencePtr    tempPtr;
  972.     MF3DErr                    result;
  973.  
  974.     result = kMF3DNoErr;
  975.  
  976.     if (data->refID >= metafile->tocStuff.refSeed)
  977.     {    if (data->refID == kMF3DUnreferencedLabel)
  978.             result = kMF3DErrIllegalRefID;
  979.         else
  980.             metafile->tocStuff.refSeed = data->refID + 1;
  981.     }
  982.  
  983.     if (result == kMF3DNoErr)
  984.     {    ++metafile->tocStuff.numReferences;
  985.         tempPtr = MF3D_Realloc(metafile->tocStuff.references,
  986.                 (metafile->tocStuff.numReferences *
  987.                 sizeof(*metafile->tocStuff.references)));
  988.         if (tempPtr == NULL)
  989.             result = kMF3DErrOutOfMemory;
  990.         else
  991.             metafile->tocStuff.references = tempPtr;
  992.     }
  993.  
  994.     if (result == kMF3DNoErr)
  995.     {    result = (*metafile->primitives->writeLabel)
  996.                 (metafile, data, location, type);
  997.     }
  998.  
  999.     if (result == kMF3DNoErr && type == kMF3DObjContainer)
  1000.         metafile->tocStuff.needToUpdate = kMF3DBooleanTrue;
  1001.  
  1002.     return result;
  1003. }
  1004.  
  1005. /*==============================================================================
  1006.  *    Dispatch Routines
  1007.  *    Preprocess
  1008.  *==============================================================================
  1009.  */
  1010. MF3DErr
  1011. MF3D_PreprocessFile(
  1012.     MF3D_FilePtr        metafile)
  1013. {
  1014.     return (*metafile->primitives->preprocess)(metafile);
  1015. }
  1016.  
  1017. /*==============================================================================
  1018.  *    Dispatch Routines
  1019.  *    Get reference name
  1020.  *==============================================================================
  1021.  */
  1022. MF3DCStringPtr
  1023. MF3D_GetRefName(
  1024.     MF3D_FilePtr        metafile,
  1025.     MF3DReferenceID        refID)
  1026. {
  1027.     return (*metafile->primitives->getRefName)(metafile, refID);
  1028. }
  1029.  
  1030. /*==============================================================================
  1031.  *    Dispatch Routines
  1032.  *    Postprocess
  1033.  *==============================================================================
  1034.  */
  1035. MF3DErr
  1036. MF3D_PostprocessFile(
  1037.     MF3D_FilePtr        metafile)
  1038. {
  1039.     return (*metafile->primitives->postprocess)(metafile);
  1040. }
  1041.  
  1042. /*==============================================================================
  1043.  *    I/O Primitive Routines
  1044.  *    Uns8 Read
  1045.  *==============================================================================
  1046.  */
  1047. MF3DErr
  1048. MF3D_Uns8ReadB(
  1049.     MF3D_FilePtr    metafile,
  1050.     MF3DUns8        *data)
  1051. {
  1052.     return MF3D_BinaryReadProc(metafile, sizeof(*data), (char *)data);
  1053. }
  1054.  
  1055. MF3DErr
  1056. MF3D_Uns8ReadT(
  1057.     MF3D_FilePtr    metafile,
  1058.     MF3DUns8        *data)
  1059. {
  1060.     unsigned short    foo;
  1061.     MF3DErr            result;
  1062.  
  1063.     result = MF3D_ScanTextBuffer(metafile, "%hu", &foo);
  1064.  
  1065.     if (result == kMF3DNoErr)
  1066.         *data = (MF3DUns8)foo;
  1067.  
  1068.     return result;
  1069. }
  1070.  
  1071. /*==============================================================================
  1072.  *    I/O Primitive Routines
  1073.  *    Uns8 Write
  1074.  *==============================================================================
  1075.  */
  1076. MF3DErr
  1077. MF3D_Uns8WriteB(
  1078.     MF3D_FilePtr    metafile,
  1079.     MF3DUns8        data)
  1080. {
  1081.     return MF3D_WriteProc(metafile, sizeof(data), &data);
  1082. }
  1083.  
  1084. MF3DErr
  1085. MF3D_Uns8WriteT(
  1086.     MF3D_FilePtr    metafile,
  1087.     MF3DUns8        data)
  1088. {
  1089.     return MF3D_OutputText(metafile, "%hu ", (unsigned short) data);
  1090. }
  1091.  
  1092. /*==============================================================================
  1093.  *    I/O Primitive Routines
  1094.  *    Uns16 Read
  1095.  *==============================================================================
  1096.  */
  1097. MF3DErr
  1098. MF3D_Uns16ReadB(
  1099.     MF3D_FilePtr    metafile,
  1100.     MF3DUns16        *data)
  1101. {
  1102.     return MF3D_BinaryReadProc(metafile, sizeof(*data), (char *)data);
  1103. }
  1104.  
  1105. MF3DErr
  1106. MF3D_Uns16ReadBS(
  1107.     MF3D_FilePtr    metafile,
  1108.     MF3DUns16        *data)
  1109. {
  1110.     MF3DErr    result;
  1111.  
  1112.     result = MF3D_BinaryReadProc(metafile, sizeof(*data), (char *)data);
  1113.  
  1114.     if (result == kMF3DNoErr)
  1115.         MF3D_ByteSwap(sizeof(*data), *data);
  1116.  
  1117.     return result;
  1118. }
  1119.  
  1120. MF3DErr
  1121. MF3D_Uns16ReadT(
  1122.     MF3D_FilePtr    metafile,
  1123.     MF3DUns16        *data)
  1124. {
  1125.     return MF3D_ScanTextBuffer(metafile, "%hu", data);
  1126. }
  1127.  
  1128. /*==============================================================================
  1129.  *    I/O Primitive Routines
  1130.  *    Uns16 Write
  1131.  *==============================================================================
  1132.  */
  1133. MF3DErr
  1134. MF3D_Uns16WriteB(
  1135.     MF3D_FilePtr    metafile,
  1136.     MF3DUns16        data)
  1137. {
  1138.     return MF3D_WriteProc(metafile, sizeof(data), &data);
  1139. }
  1140.  
  1141. MF3DErr
  1142. MF3D_Uns16WriteBS(
  1143.     MF3D_FilePtr    metafile,
  1144.     MF3DUns16        data)
  1145. {
  1146.     MF3D_ByteSwap(sizeof(data), data);
  1147.     return MF3D_WriteProc(metafile, sizeof(data), &data);
  1148. }
  1149.  
  1150. MF3DErr
  1151. MF3D_Uns16WriteT(
  1152.     MF3D_FilePtr    metafile,
  1153.     MF3DUns16        data)
  1154. {
  1155.     return MF3D_OutputText(metafile, "%hu ", data);
  1156. }
  1157.  
  1158. /*==============================================================================
  1159.  *    I/O Primitive Routines
  1160.  *    Uns32 Read
  1161.  *==============================================================================
  1162.  */
  1163. MF3DErr
  1164. MF3D_Uns32ReadB(
  1165.     MF3D_FilePtr    metafile,
  1166.     MF3DUns32        *data)
  1167. {
  1168.     return MF3D_BinaryReadProc(metafile, sizeof(*data), (char *)data);
  1169. }
  1170.  
  1171. MF3DErr
  1172. MF3D_Uns32ReadBS(
  1173.     MF3D_FilePtr    metafile,
  1174.     MF3DUns32        *data)
  1175. {
  1176.     MF3DErr    result;
  1177.  
  1178.     result = MF3D_BinaryReadProc(metafile, sizeof(*data), (char *)data);
  1179.  
  1180.     if (result == kMF3DNoErr)
  1181.         MF3D_ByteSwap(sizeof(*data), *data);
  1182.  
  1183.     return result;
  1184. }
  1185.  
  1186. MF3DErr
  1187. MF3D_Uns32ReadT(
  1188.     MF3D_FilePtr    metafile,
  1189.     MF3DUns32        *data)
  1190. {
  1191.     return MF3D_ScanTextBuffer(metafile, "%lu", data);
  1192. }
  1193.  
  1194. /*==============================================================================
  1195.  *    I/O Primitive Routines
  1196.  *    Uns32 Write
  1197.  *==============================================================================
  1198.  */
  1199. MF3DErr
  1200. MF3D_Uns32WriteB(
  1201.     MF3D_FilePtr    metafile,
  1202.     MF3DUns32        data)
  1203. {
  1204.     return MF3D_WriteProc(metafile, sizeof(data), &data);
  1205. }
  1206.  
  1207. MF3DErr
  1208. MF3D_Uns32WriteBS(
  1209.     MF3D_FilePtr    metafile,
  1210.     MF3DUns32        data)
  1211. {
  1212.     MF3D_ByteSwap(sizeof(data), data);
  1213.     return MF3D_WriteProc(metafile, sizeof(data), &data);
  1214. }
  1215.  
  1216. MF3DErr
  1217. MF3D_Uns32WriteT(
  1218.     MF3D_FilePtr    metafile,
  1219.     MF3DUns32        data)
  1220. {
  1221.     return MF3D_OutputText(metafile, "%lu ", data);
  1222. }
  1223.  
  1224. /*==============================================================================
  1225.  *    I/O Primitive Routines
  1226.  *    Uns64 Read
  1227.  *==============================================================================
  1228.  */
  1229. MF3DErr
  1230. MF3D_Uns64ReadB(
  1231.     MF3D_FilePtr    metafile,
  1232.     MF3DUns64        *data)
  1233. {
  1234.     return MF3D_BinaryReadProc(metafile, sizeof(*data), (char *)data);
  1235. }
  1236.  
  1237. MF3DErr
  1238. MF3D_Uns64ReadBS(
  1239.     MF3D_FilePtr    metafile,
  1240.     MF3DUns64        *data)
  1241. {
  1242.     MF3DErr    result;
  1243.  
  1244.     result = MF3D_BinaryReadProc(metafile, sizeof(*data), (char *)data);
  1245.  
  1246.     if (result == kMF3DNoErr)
  1247.         MF3D_ByteSwap(sizeof(*data), *data);
  1248.  
  1249.     return result;
  1250. }
  1251.  
  1252. MF3DErr
  1253. MF3D_Uns64ReadT(
  1254.     MF3D_FilePtr    metafile,
  1255.     MF3DUns64        *data)
  1256. {
  1257.     /* ### NOT FULLY SUPPORTED IN 1.0 ### */
  1258.     data->hi = 0L;
  1259.     return MF3D_ScanTextBuffer(metafile, "%lu", &(data->lo));
  1260. }
  1261.  
  1262. /*==============================================================================
  1263.  *    I/O Primitive Routines
  1264.  *    Uns64 Write
  1265.  *==============================================================================
  1266.  */
  1267. MF3DErr
  1268. MF3D_Uns64WriteB(
  1269.     MF3D_FilePtr    metafile,
  1270.     MF3DUns64        data)
  1271. {
  1272.     return MF3D_WriteProc(metafile, sizeof(data), &data);
  1273. }
  1274.  
  1275. MF3DErr
  1276. MF3D_Uns64WriteBS(
  1277.     MF3D_FilePtr    metafile,
  1278.     MF3DUns64        data)
  1279. {
  1280.     MF3D_ByteSwap(sizeof(data), data);
  1281.     return MF3D_WriteProc(metafile, sizeof(data), &data);
  1282. }
  1283.  
  1284. MF3DErr
  1285. MF3D_Uns64WriteT(
  1286.     MF3D_FilePtr    metafile,
  1287.     MF3DUns64        data)
  1288. {
  1289.     MFASSERT(data.hi == 0);
  1290.  
  1291.     /* ### NOT FULLY SUPPORTED IN 1.0 ### */
  1292.     if (data.hi != 0)
  1293.     {    /* ### Values > 2^32-1 cannot be written to text files. */
  1294.         return kMF3DErrUnsupportedUns64;
  1295.     }
  1296.  
  1297.     return MF3D_OutputText(metafile, "%lu ", data.lo);
  1298. }
  1299.  
  1300. /*==============================================================================
  1301.  *    I/O Primitive Routines
  1302.  *    Int8 Read
  1303.  *==============================================================================
  1304.  */
  1305. MF3DErr
  1306. MF3D_Int8ReadB(
  1307.     MF3D_FilePtr    metafile,
  1308.     MF3DInt8        *data)
  1309. {
  1310.     return MF3D_BinaryReadProc(metafile, sizeof(*data), (char *)data);
  1311. }
  1312.  
  1313. MF3DErr
  1314. MF3D_Int8ReadT(
  1315.     MF3D_FilePtr    metafile,
  1316.     MF3DInt8        *data)
  1317. {
  1318.     short            foo;
  1319.     MF3DErr            result;
  1320.  
  1321.     result = MF3D_ScanTextBuffer(metafile, "%hd", &foo);
  1322.  
  1323.     if (result == kMF3DNoErr)
  1324.         *data = (MF3DInt8)foo;
  1325.  
  1326.     return result;
  1327. }
  1328.  
  1329. /*==============================================================================
  1330.  *    I/O Primitive Routines
  1331.  *    Int8 Write
  1332.  *==============================================================================
  1333.  */
  1334. MF3DErr
  1335. MF3D_Int8WriteB(
  1336.     MF3D_FilePtr    metafile,
  1337.     MF3DInt8        data)
  1338. {
  1339.     return MF3D_WriteProc(metafile, sizeof(data), &data);
  1340. }
  1341.  
  1342. MF3DErr
  1343. MF3D_Int8WriteT(
  1344.     MF3D_FilePtr    metafile,
  1345.     MF3DInt8        data)
  1346. {
  1347.     return MF3D_OutputText(metafile, "%hd ", (short) data);
  1348. }
  1349.  
  1350. /*==============================================================================
  1351.  *    I/O Primitive Routines
  1352.  *    Int16 Read
  1353.  *==============================================================================
  1354.  */
  1355. MF3DErr
  1356. MF3D_Int16ReadB(
  1357.     MF3D_FilePtr    metafile,
  1358.     MF3DInt16        *data)
  1359. {
  1360.     return MF3D_BinaryReadProc(metafile, sizeof(*data), (char *)data);
  1361. }
  1362.  
  1363. MF3DErr
  1364. MF3D_Int16ReadBS(
  1365.     MF3D_FilePtr    metafile,
  1366.     MF3DInt16        *data)
  1367. {
  1368.     MF3DErr    result;
  1369.  
  1370.     result = MF3D_BinaryReadProc(metafile, sizeof(*data), (char *)data);
  1371.  
  1372.     if (result == kMF3DNoErr)
  1373.         MF3D_ByteSwap(sizeof(*data), *data);
  1374.  
  1375.     return result;
  1376. }
  1377.  
  1378. MF3DErr
  1379. MF3D_Int16ReadT(
  1380.     MF3D_FilePtr    metafile,
  1381.     MF3DInt16        *data)
  1382. {
  1383.     return MF3D_ScanTextBuffer(metafile, "%hd", data);
  1384. }
  1385.  
  1386. /*==============================================================================
  1387.  *    I/O Primitive Routines
  1388.  *    Int16 Write
  1389.  *==============================================================================
  1390.  */
  1391. MF3DErr
  1392. MF3D_Int16WriteB(
  1393.     MF3D_FilePtr    metafile,
  1394.     MF3DInt16        data)
  1395. {
  1396.     return MF3D_WriteProc(metafile, sizeof(data), &data);
  1397. }
  1398.  
  1399. MF3DErr
  1400. MF3D_Int16WriteBS(
  1401.     MF3D_FilePtr    metafile,
  1402.     MF3DInt16        data)
  1403. {
  1404.     MF3D_ByteSwap(sizeof(data), data);
  1405.     return MF3D_WriteProc(metafile, sizeof(data), &data);
  1406. }
  1407.  
  1408. MF3DErr
  1409. MF3D_Int16WriteT(
  1410.     MF3D_FilePtr    metafile,
  1411.     MF3DInt16        data)
  1412. {
  1413.     return MF3D_OutputText(metafile, "%hd ", data);
  1414. }
  1415.  
  1416. /*==============================================================================
  1417.  *    I/O Primitive Routines
  1418.  *    Int32 Read
  1419.  *==============================================================================
  1420.  */
  1421. MF3DErr
  1422. MF3D_Int32ReadB(
  1423.     MF3D_FilePtr    metafile,
  1424.     MF3DInt32        *data)
  1425. {
  1426.     return MF3D_BinaryReadProc(metafile, sizeof(*data), (char *)data);
  1427. }
  1428.  
  1429. MF3DErr
  1430. MF3D_Int32ReadBS(
  1431.     MF3D_FilePtr    metafile,
  1432.     MF3DInt32        *data)
  1433. {
  1434.     MF3DErr    result;
  1435.  
  1436.     result = MF3D_BinaryReadProc(metafile, sizeof(*data), (char *)data);
  1437.  
  1438.     if (result == kMF3DNoErr)
  1439.         MF3D_ByteSwap(sizeof(*data), *data);
  1440.  
  1441.     return result;
  1442. }
  1443.  
  1444. MF3DErr
  1445. MF3D_Int32ReadT(
  1446.     MF3D_FilePtr    metafile,
  1447.     MF3DInt32        *data)
  1448. {
  1449.     return MF3D_ScanTextBuffer(metafile, "%ld", data);
  1450. }
  1451.  
  1452. /*==============================================================================
  1453.  *    I/O Primitive Routines
  1454.  *    Int32 Write
  1455.  *==============================================================================
  1456.  */
  1457. MF3DErr
  1458. MF3D_Int32WriteB(
  1459.     MF3D_FilePtr    metafile,
  1460.     MF3DInt32        data)
  1461. {
  1462.     return MF3D_WriteProc(metafile, sizeof(data), &data);
  1463. }
  1464.  
  1465. MF3DErr
  1466. MF3D_Int32WriteBS(
  1467.     MF3D_FilePtr    metafile,
  1468.     MF3DInt32        data)
  1469. {
  1470.     MF3D_ByteSwap(sizeof(data), data);
  1471.     return MF3D_WriteProc(metafile, sizeof(data), &data);
  1472. }
  1473.  
  1474. MF3DErr
  1475. MF3D_Int32WriteT(
  1476.     MF3D_FilePtr    metafile,
  1477.     MF3DInt32        data)
  1478. {
  1479.     return MF3D_OutputText(metafile, "%ld ", data);
  1480. }
  1481.  
  1482. /*==============================================================================
  1483.  *    I/O Primitive Routines
  1484.  *    Int64 Read
  1485.  *==============================================================================
  1486.  */
  1487. MF3DErr
  1488. MF3D_Int64ReadB(
  1489.     MF3D_FilePtr    metafile,
  1490.     MFINT64        *data)
  1491. {
  1492.     return MF3D_BinaryReadProc(metafile, sizeof(*data), (char *)data);
  1493. }
  1494.  
  1495. MF3DErr
  1496. MF3D_Int64ReadBS(
  1497.     MF3D_FilePtr    metafile,
  1498.     MFINT64        *data)
  1499. {
  1500.     MF3DErr    result;
  1501.  
  1502.     result = MF3D_BinaryReadProc(metafile, sizeof(*data), (char *)data);
  1503.  
  1504.     if (result == kMF3DNoErr)
  1505.         MF3D_ByteSwap(sizeof(*data), *data);
  1506.  
  1507.     return result;
  1508. }
  1509.  
  1510. MF3DErr
  1511. MF3D_Int64ReadT(
  1512.     MF3D_FilePtr    metafile,
  1513.     MFINT64        *data)
  1514. {
  1515.     /* ### NOT FULLY SUPPORTED IN 1.0 ### */
  1516.     data->hi = 0L;
  1517.     return MF3D_ScanTextBuffer(metafile, "%ld", &(data->lo));
  1518. }
  1519.  
  1520. /*==============================================================================
  1521.  *    I/O Primitive Routines
  1522.  *    Int64 Write
  1523.  *==============================================================================
  1524.  */
  1525. MF3DErr
  1526. MF3D_Int64WriteB(
  1527.     MF3D_FilePtr    metafile,
  1528.     MFINT64        data)
  1529. {
  1530.     return MF3D_WriteProc(metafile, sizeof(data), &data);
  1531. }
  1532.  
  1533. MF3DErr
  1534. MF3D_Int64WriteBS(
  1535.     MF3D_FilePtr    metafile,
  1536.     MFINT64        data)
  1537. {
  1538.     MF3D_ByteSwap(sizeof(data), data);
  1539.     return MF3D_WriteProc(metafile, sizeof(data), &data);
  1540. }
  1541.  
  1542. MF3DErr
  1543. MF3D_Int64WriteT(
  1544.     MF3D_FilePtr    metafile,
  1545.     MFINT64        data)
  1546. {
  1547.     /* ### NOT FULLY SUPPORTED IN 1.0 ### */
  1548.  
  1549.     if ((data.lo < 0 && data.hi != -1) ||
  1550.         (data.lo >= 0 && data.hi != 0))
  1551.     {    /* ### Full 64-bit numbers cannot be written to text files. ### */
  1552.         return kMF3DErrUnsupportedInt64;
  1553.     }
  1554.  
  1555.     return MF3D_OutputText(metafile, "%ld ", data.lo);
  1556. }
  1557.  
  1558. /*==============================================================================
  1559.  *    I/O Primitive Routines
  1560.  *    Float32 Read
  1561.  *==============================================================================
  1562.  */
  1563. MF3DErr
  1564. MF3D_Float32ReadB(
  1565.     MF3D_FilePtr    metafile,
  1566.     MF3DFloat32        *data)
  1567. {
  1568.     return MF3D_BinaryReadProc(metafile, sizeof(*data), (char *)data);
  1569. }
  1570.  
  1571. MF3DErr
  1572. MF3D_Float32ReadBS(
  1573.     MF3D_FilePtr    metafile,
  1574.     MF3DFloat32        *data)
  1575. {
  1576.     MF3DErr    result;
  1577.  
  1578.     result = MF3D_BinaryReadProc(metafile, sizeof(*data), (char *)data);
  1579.  
  1580.     if (result == kMF3DNoErr)
  1581.         MF3D_ByteSwap(sizeof(*data), *data);
  1582.  
  1583.     return result;
  1584. }
  1585.  
  1586. MF3DErr
  1587. MF3D_Float32ReadT(
  1588.     MF3D_FilePtr    metafile,
  1589.     MF3DFloat32        *data)
  1590. {
  1591.     return MF3D_ScanTextBuffer(metafile, "%f", data);
  1592. }
  1593.  
  1594. /*==============================================================================
  1595.  *    I/O Primitive Routines
  1596.  *    Float32 Write
  1597.  *==============================================================================
  1598.  */
  1599. MF3DErr
  1600. MF3D_Float32WriteB(
  1601.     MF3D_FilePtr    metafile,
  1602.     MF3DFloat32        data)
  1603. {
  1604.     return MF3D_WriteProc(metafile, sizeof(data), &data);
  1605. }
  1606.  
  1607. MF3DErr
  1608. MF3D_Float32WriteBS(
  1609.     MF3D_FilePtr    metafile,
  1610.     MF3DFloat32        data)
  1611. {
  1612.     MF3D_ByteSwap(sizeof(data), data);
  1613.     return MF3D_WriteProc(metafile, sizeof(data), &data);
  1614. }
  1615.  
  1616. MF3DErr
  1617. MF3D_Float32WriteT(
  1618.     MF3D_FilePtr    metafile,
  1619.     MF3DFloat32        data)
  1620. {
  1621.     return MF3D_OutputText(metafile, "%.7hg ", data);
  1622. }
  1623.  
  1624. /*==============================================================================
  1625.  *    I/O Primitive Routines
  1626.  *    Float64 Read
  1627.  *==============================================================================
  1628.  */
  1629. MF3DErr
  1630. MF3D_Float64ReadB(
  1631.     MF3D_FilePtr    metafile,
  1632.     MF3DFloat64        *data)
  1633. {
  1634.     return MF3D_BinaryReadProc(metafile, sizeof(*data), (char *)data);
  1635. }
  1636.  
  1637. MF3DErr
  1638. MF3D_Float64ReadBS(
  1639.     MF3D_FilePtr    metafile,
  1640.     MF3DFloat64        *data)
  1641. {
  1642.     MF3DErr    result;
  1643.  
  1644.     result = MF3D_BinaryReadProc(metafile, sizeof(*data), (char *)data);
  1645.  
  1646.     if (result == kMF3DNoErr)
  1647.         MF3D_ByteSwap(sizeof(*data), *data);
  1648.  
  1649.     return result;
  1650. }
  1651.  
  1652. MF3DErr
  1653. MF3D_Float64ReadT(
  1654.     MF3D_FilePtr    metafile,
  1655.     MF3DFloat64        *data)
  1656. {
  1657.     return MF3D_ScanTextBuffer(metafile, "%lf", data);
  1658. }
  1659.  
  1660. /*==============================================================================
  1661.  *    I/O Primitive Routines
  1662.  *    Float64 Write
  1663.  *==============================================================================
  1664.  */
  1665. MF3DErr
  1666. MF3D_Float64WriteB(
  1667.     MF3D_FilePtr    metafile,
  1668.     MF3DFloat64        data)
  1669. {
  1670.     return MF3D_WriteProc(metafile, sizeof(data), &data);
  1671. }
  1672.  
  1673. MF3DErr
  1674. MF3D_Float64WriteBS(
  1675.     MF3D_FilePtr    metafile,
  1676.     MF3DFloat64        data)
  1677. {
  1678.     MF3D_ByteSwap(sizeof(data), data);
  1679.     return MF3D_WriteProc(metafile, sizeof(data), &data);
  1680. }
  1681.  
  1682. MF3DErr
  1683. MF3D_Float64WriteT(
  1684.     MF3D_FilePtr    metafile,
  1685.     MF3DFloat64        data)
  1686. {
  1687.     return MF3D_OutputText(metafile, "%.17lg ", data);
  1688. }
  1689.  
  1690. /*==============================================================================
  1691.  *    I/O Primitive Routines
  1692.  *    String Read
  1693.  *==============================================================================
  1694.  */
  1695. MF3DErr
  1696. MF3D_CStringReadB(
  1697.     MF3D_FilePtr    metafile,
  1698.     MF3DCStringPtr    *data)
  1699. {
  1700.     MF3D_BuildString    tempStr;
  1701.     MF3DErr                result;
  1702.     char                c;
  1703.  
  1704.     MFASSERT((tempStr.str = NULL) == NULL);
  1705.  
  1706.     result = MF3D_BuildString_New(&tempStr);
  1707.  
  1708.     while (result == kMF3DNoErr)
  1709.     {    MF3D_ValidateReadSize(metafile, sizeof(c));
  1710.         result = MF3D_BinaryReadProc(metafile, sizeof(c), &c);
  1711.         if (result == kMF3DNoErr && c == '\0')
  1712.         {    result = MF3D_BuildString_EndString(&tempStr);
  1713.             *data = tempStr.str;
  1714.             break;                    /* ### NORMAL EXIT IS HERE ### */
  1715.         }
  1716.         if (result == kMF3DNoErr)
  1717.             result = MF3D_BuildString_AddChar(&tempStr, c);
  1718.     }
  1719.  
  1720.     if (result != kMF3DNoErr)
  1721.         MFASSERT(tempStr.str == NULL);
  1722.  
  1723.     return result;
  1724. }
  1725.  
  1726. MF3DErr
  1727. MF3D_CStringReadT(
  1728.     MF3D_FilePtr    metafile,
  1729.     MF3DCStringPtr    *data)
  1730. {
  1731.     /* NOTE! We are not currently calling MF3D_ValidateReadSize */
  1732.     return MF3D_ReadTextString(metafile, data);
  1733. }
  1734.  
  1735. /*==============================================================================
  1736.  *    I/O Primitive Routines
  1737.  *    String Write
  1738.  *==============================================================================
  1739.  */
  1740. MF3DErr
  1741. MF3D_CStringWriteB(
  1742.     MF3D_FilePtr    metafile,
  1743.     MF3DCStringPtr    data)
  1744. {
  1745.     MF3DUns32    len;
  1746.     MF3DErr        result;
  1747.  
  1748.     len = CStringLen(data);
  1749.  
  1750.     /* Write the string */
  1751.     MF3D_ValidateWriteSize(metafile, len);
  1752.     result = MF3D_WriteProc(metafile, len, data);
  1753.  
  1754.     /* Add end-of-string character and pad to 4-byte boundary */
  1755.     if (result == kMF3DNoErr)
  1756.     {    MF3DUns32    padding;
  1757.  
  1758.         padding = 5 - ((len + 1) % 4);
  1759.         MFASSERT(padding >= 1 && padding <= 4);
  1760.  
  1761.         MF3D_ValidateWriteSize(metafile, padding);
  1762.         result = MF3D_WriteProc(metafile, padding, &zero);
  1763.     }
  1764.  
  1765.     return result;
  1766. }
  1767.  
  1768. MF3DErr
  1769. MF3D_CStringWriteT(
  1770.     MF3D_FilePtr    metafile,
  1771.     MF3DCStringPtr    data)
  1772. {
  1773.     return MF3D_WriteTextString(metafile, data);
  1774. }
  1775.  
  1776. /*==============================================================================
  1777.  *    I/O Primitive Routines
  1778.  *    Raw Data Read
  1779.  *==============================================================================
  1780.  */
  1781. MF3DErr
  1782. MF3D_RawDataReadB(
  1783.     MF3D_FilePtr    metafile,
  1784.     MF3DSize        size,
  1785.     MF3DRawDataPtr     data)
  1786. {
  1787.     char    ignoredData[3];
  1788.     MF3DErr    result;
  1789.  
  1790.     result = MF3D_BinaryReadProc(metafile, size, (char *)data);
  1791.  
  1792.     if (result == kMF3DNoErr)
  1793.     {    if ((size % 4) != 0)
  1794.             result = MF3D_BinaryReadProc(metafile, 4 - (size % 4), ignoredData);
  1795.     }
  1796.  
  1797.     return result;
  1798. }
  1799.  
  1800. MF3DErr
  1801. MF3D_RawDataReadT(
  1802.     MF3D_FilePtr    metafile,
  1803.     MF3DSize        size,
  1804.     MF3DRawDataPtr     data)
  1805. {
  1806.     MF3DSize        leftToRead;
  1807.     MF3DErr            result;
  1808.     MF3DRawDataPtr    rawDataPtr;
  1809.     char            *inputStr;
  1810.     char            formatString[kMF3D_MaxDigitsInUns32 + 5 +
  1811.                             kMF3D_HexCharListLen + 1];
  1812.  
  1813.     leftToRead = size;
  1814.     result = kMF3DNoErr;
  1815.     rawDataPtr = data;
  1816.  
  1817.     /* two text chars represent one hex byte */
  1818.     inputStr = MF3D_Malloc(leftToRead * 2 + kMF3D_RawDataHexPrefixLen + 1);
  1819.     if (inputStr == NULL)
  1820.         result = kMF3DErrOutOfMemory;
  1821.  
  1822.     while (leftToRead > 0 && result == kMF3DNoErr)
  1823.     {    char        numString[kMF3D_MaxDigitsInUns32 + 1];
  1824.  
  1825.         inputStr = MF3D_Realloc(inputStr, leftToRead * 2 +
  1826.                 kMF3D_RawDataHexPrefixLen + 1);
  1827.         MFASSERT(inputStr != NULL);    /* should not happen when downsizing */
  1828.  
  1829.         /* Build a format string such that data will not be overflowed */
  1830.         strcpy(formatString, kMF3D_RawDataHexPrefix "%");
  1831.         MF3D_NumToString(leftToRead * 2, numString);
  1832.         strcat(formatString, numString);
  1833.         strcat(formatString, "[" kMF3D_HexCharList "]");
  1834.  
  1835.         /* Copy into where we last left off */
  1836.         result = MF3D_ScanTextBuffer(metafile, formatString, inputStr);
  1837.  
  1838.         if (result == kMF3DNoErr)
  1839.         {    char    c1, c2, *indexStr;
  1840.  
  1841.             indexStr = inputStr;
  1842.             while ((c1 = *indexStr++) != '\0' && (c2 = *indexStr++) != '\0')
  1843.             {    *rawDataPtr++ = (MF3D_TextToHex(c1) << 4) | MF3D_TextToHex(c2);
  1844.                 --leftToRead;
  1845.             }
  1846.             if (c1 != '\0')
  1847.                 result = kMF3DErrRawDataOddNumberOfHexChars;
  1848.         }
  1849.     }
  1850.  
  1851.     MF3D_Free(inputStr);
  1852.  
  1853.     return result;
  1854. }
  1855.  
  1856. /*==============================================================================
  1857.  *    I/O Primitive Routines
  1858.  *    Raw Data Write
  1859.  *==============================================================================
  1860.  */
  1861. MF3DErr
  1862. MF3D_RawDataWriteB(
  1863.     MF3D_FilePtr    metafile,
  1864.     MF3DSize        size,
  1865.     MF3DRawDataPtr     data)
  1866. {
  1867.     MF3DErr    result;
  1868.  
  1869.     result = MF3D_WriteProc(metafile, size, data);
  1870.  
  1871.     if (result == kMF3DNoErr && (size % 4) > 0)
  1872.     {    result = MF3D_WriteProc(metafile, 4 - (size % 4), &zero);
  1873.     }
  1874.  
  1875.     return result;
  1876. }
  1877.     
  1878. MF3DErr
  1879. MF3D_RawDataWriteT(
  1880.     MF3D_FilePtr    metafile,
  1881.     MF3DSize        size,
  1882.     MF3DRawDataPtr     data)
  1883. {
  1884.     unsigned char    *dataPtr;
  1885.     MF3DSize        leftToDo;
  1886.     unsigned int    bytesToDoOnThisLine;
  1887.     MF3DErr            result;
  1888.  
  1889.     leftToDo = size;
  1890.     dataPtr = (unsigned char *) data;
  1891.  
  1892.     MF3D_WriteNewLine(metafile);
  1893.  
  1894.     while (result == kMF3DNoErr && leftToDo > 0)
  1895.     {    
  1896.         bytesToDoOnThisLine = kMF3D_RawDataBytesPerLine;
  1897.  
  1898.         result = MF3D_OutputText(metafile, "%s", kMF3D_RawDataHexPrefix);
  1899.  
  1900.         while (result == kMF3DNoErr &&
  1901.                 leftToDo > 0 && bytesToDoOnThisLine-- > 0)
  1902.         {    result = MF3D_OutputText(metafile, "%.2X", *dataPtr++);
  1903.             --leftToDo;
  1904.         }
  1905.  
  1906.         if (result == kMF3DNoErr)
  1907.             MF3D_WriteNewLine(metafile);
  1908.     }
  1909.  
  1910.     return result;
  1911. }
  1912.     
  1913. /*==============================================================================
  1914.  *    I/O Primitive Routines
  1915.  *    Enum Read
  1916.  *==============================================================================
  1917.  */
  1918. MF3DErr    MF3D_EnumReadB(
  1919.     MF3D_FilePtr        metafile,
  1920.     MF3D_EnumTablePtr    labelID,
  1921.     MF3DEnumData        *data)
  1922. {
  1923.     MF3D_Unused(labelID);
  1924.  
  1925.     return MF3D_Uns32ReadB(metafile, data);
  1926. }
  1927.  
  1928. MF3DErr    MF3D_EnumReadBS(
  1929.     MF3D_FilePtr        metafile,
  1930.     MF3D_EnumTablePtr    labelID,
  1931.     MF3DEnumData        *data)
  1932. {
  1933.     MF3D_Unused(labelID);
  1934.  
  1935.     return MF3D_Uns32ReadBS(metafile, data);
  1936. }
  1937.  
  1938. MF3DErr    MF3D_EnumReadT(
  1939.     MF3D_FilePtr        metafile,
  1940.     MF3D_EnumTablePtr    labelID,
  1941.     MF3DEnumData        *data)
  1942. {
  1943.     MF3DUns32    num;
  1944.     MF3DErr        result;
  1945.     char        str[kMF3D_MaxLabelLength + 1];
  1946.  
  1947.     /* Check for number or text */
  1948.     result = MF3D_ScanTextBuffer(metafile, "%li", &num);
  1949.  
  1950.     if (result == kMF3DNoErr)
  1951.     {    /* got a number for some reason */
  1952.         result = MF3D_MatchLabelByValue(labelID, num, NULL);
  1953.     }
  1954.     else
  1955.     {    result = MF3D_ScanTextBuffer(metafile,
  1956.                 "%[" KMF3D_TextCharList "]", str);
  1957.         if (result == kMF3DNoErr)
  1958.         {    result = MF3D_MatchLabelByName(labelID, str, &num);
  1959.         }
  1960.     }
  1961.  
  1962.     if (result == kMF3DNoErr)
  1963.         *data = num;
  1964.  
  1965.     return result;
  1966. }
  1967.  
  1968. /*==============================================================================
  1969.  *    I/O Primitive Routines
  1970.  *    Enum Write
  1971.  *==============================================================================
  1972.  */
  1973. MF3DErr    MF3D_EnumWriteB(
  1974.     MF3D_FilePtr        metafile,
  1975.     MF3D_EnumTablePtr    labelID,
  1976.     MF3DEnumData        data)
  1977. {
  1978.     MF3D_Unused(labelID);
  1979.  
  1980.     return MF3D_Uns32WriteB(metafile, data);
  1981. }
  1982.  
  1983. MF3DErr    MF3D_EnumWriteBS(
  1984.     MF3D_FilePtr        metafile,
  1985.     MF3D_EnumTablePtr    labelID,
  1986.     MF3DEnumData        data)
  1987. {
  1988.     MF3D_Unused(labelID);
  1989.  
  1990.     return MF3D_Uns32WriteBS(metafile, data);
  1991. }
  1992.  
  1993. MF3DErr    MF3D_EnumWriteT(
  1994.     MF3D_FilePtr        metafile,
  1995.     MF3D_EnumTablePtr    labelID,
  1996.     MF3DEnumData        data)
  1997. {
  1998.     MF3DErr            result;
  1999.     MF3DCStringPtr    labelStr;
  2000.  
  2001.     result = MF3D_MatchLabelByValue(labelID, data, &labelStr);
  2002.  
  2003.     if (result == kMF3DNoErr)
  2004.     {    result = MF3D_OutputText(metafile, "%s ", labelStr);
  2005.         MF3D_Free(labelStr);
  2006.     }
  2007.  
  2008.     return result;
  2009. }
  2010.  
  2011. /*==============================================================================
  2012.  *    I/O Primitive Routines
  2013.  *    Flags Read
  2014.  *==============================================================================
  2015.  */
  2016. MF3DErr    MF3D_FlagsReadB(
  2017.     MF3D_FilePtr        metafile,
  2018.     MF3D_FlagTablePtr    labelID,
  2019.     MF3DFlagData        *data)
  2020. {
  2021.     MF3D_Unused(labelID);
  2022.  
  2023.     return MF3D_Uns32ReadB(metafile, data);
  2024. }
  2025.  
  2026. MF3DErr    MF3D_FlagsReadBS(
  2027.     MF3D_FilePtr        metafile,
  2028.     MF3D_FlagTablePtr    labelID,
  2029.     MF3DFlagData        *data)
  2030. {
  2031.     MF3D_Unused(labelID);
  2032.  
  2033.     return MF3D_Uns32ReadBS(metafile, data);
  2034. }
  2035.  
  2036. MF3DErr    MF3D_FlagsReadT(
  2037.     MF3D_FilePtr        metafile,
  2038.     MF3D_FlagTablePtr    labelID,
  2039.     MF3DFlagData        *data)
  2040. {
  2041.     MF3DUns32    num;
  2042.     MF3DUns32    flagValue;
  2043.     MF3DErr        result;
  2044.     char        str[kMF3D_MaxLabelLength + 1];
  2045.  
  2046.     /* Check for number or text */
  2047.     result = MF3D_ScanTextBuffer(metafile, "%li", &num);
  2048.  
  2049.     if (result == kMF3DNoErr)
  2050.     {    /* got a number for some reason */
  2051.         MF3DUns32    flagShifter;
  2052.  
  2053.         flagShifter = num;
  2054.         flagValue = 1;
  2055.         while (result == kMF3DNoErr && flagShifter > 0)
  2056.         {    /* Check each set flag to see whether it exists */
  2057.             if (flagShifter & 0x00000001)
  2058.             {    result = MF3D_MatchLabelByValue(labelID, flagValue, NULL);
  2059.             }
  2060.             flagValue <<= 1;
  2061.             flagShifter >>= 1;
  2062.         }
  2063.     }
  2064.     else
  2065.     {    num = 0;
  2066.         do
  2067.         {    result = MF3D_ScanTextBuffer(metafile,
  2068.                     "%[" KMF3D_TextCharList "]", str);
  2069.             if (result == kMF3DNoErr)
  2070.             {    result = MF3D_MatchLabelByName(labelID, str, &flagValue);
  2071.                 num |= flagValue;
  2072.             }
  2073.         } while (result == kMF3DNoErr && MF3D_ScanTextBuffer(metafile,
  2074.                     "%1[" kMF3D_OrCharStr "]", str) == kMF3DNoErr);
  2075.     }
  2076.  
  2077.     if (result == kMF3DNoErr)
  2078.         *data = num;
  2079.  
  2080.     return result;
  2081. }
  2082.  
  2083. /*==============================================================================
  2084.  *    I/O Primitive Routines
  2085.  *    Flags Write
  2086.  *==============================================================================
  2087.  */
  2088. MF3DErr    MF3D_FlagsWriteB(
  2089.     MF3D_FilePtr        metafile,
  2090.     MF3D_FlagTablePtr    labelID,
  2091.     MF3DFlagData        data)
  2092. {
  2093.     MF3D_Unused(labelID);
  2094.  
  2095.     return MF3D_Uns32WriteB(metafile, data);
  2096. }
  2097.  
  2098. MF3DErr    MF3D_FlagsWriteBS(
  2099.     MF3D_FilePtr        metafile,
  2100.     MF3D_FlagTablePtr    labelID,
  2101.     MF3DFlagData        data)
  2102. {
  2103.     MF3D_Unused(labelID);
  2104.  
  2105.     return MF3D_Uns32WriteBS(metafile, data);
  2106. }
  2107.  
  2108. MF3DErr    MF3D_FlagsWriteT(
  2109.     MF3D_FilePtr        metafile,
  2110.     MF3D_FlagTablePtr    labelID,
  2111.     MF3DFlagData        data)
  2112. {
  2113.     MF3DErr            result;
  2114.     MF3DCStringPtr    labelStr;
  2115.  
  2116.     result = kMF3DNoErr;
  2117.  
  2118.     if (data == 0)
  2119.     {    /* All flags off */
  2120.         result = MF3D_MatchLabelByValue(labelID, data, &labelStr);
  2121.  
  2122.         if (result == kMF3DNoErr)
  2123.         {    result = MF3D_OutputText(metafile, "%s ", labelStr);
  2124.             MF3D_Free(labelStr);
  2125.         }
  2126.     }
  2127.     else
  2128.     {    /* At least one flag on */
  2129.         MF3DUns32    flagShifter;
  2130.         MF3DUns32    flagValue;
  2131.  
  2132.         flagShifter = data;
  2133.         flagValue = 0x00000001;
  2134.         do
  2135.         {    if (flagShifter & 0x00000001)
  2136.             {    char    formatStr[5];
  2137.  
  2138.                 result = MF3D_MatchLabelByValue(labelID, flagValue, &labelStr);
  2139.                 if (result == kMF3DNoErr)
  2140.                 {    strcpy(formatStr, "%s ");
  2141.                     /* If there is more to come, add the Or character */
  2142.                     if (flagShifter > 0x00000001)
  2143.                         strcat(formatStr, kMF3D_OrCharStr " ");
  2144.  
  2145.                     result = MF3D_OutputText(metafile, formatStr, labelStr);
  2146.                     MF3D_Free(labelStr);
  2147.                 }
  2148.             }
  2149.             flagShifter >>= 1;
  2150.             flagValue <<= 1;
  2151.         } while (result == kMF3DNoErr && flagShifter > 0);
  2152.     }
  2153.  
  2154.     return result;
  2155. }
  2156.  
  2157. /*==============================================================================
  2158.  *    I/O Primitive Routines
  2159.  *    Begin Object
  2160.  *==============================================================================
  2161.  */
  2162. MF3DErr
  2163. MF3D_BeginReadB(
  2164.     MF3D_FilePtr        metafile,
  2165.     MF3D_ObjStuffPtr    *objStuff,
  2166.     MF3DReferenceID        *refID,
  2167.     MF3DObjType            *objType)
  2168. {
  2169.     MF3DBinaryFilePosition    location;
  2170.     MF3DUns32                objectSize;
  2171.     char                    *readBuffer;
  2172.     MF3DErr                    result;
  2173.  
  2174.     /* Need to know where we are to see whether there is a label here. */
  2175.     result = MF3DTellPosition(metafile, &location);
  2176.  
  2177.     /* Read signature and size */
  2178.     if (result == kMF3DNoErr)
  2179.     {    if (metafile->readBuffer.buf == NULL)
  2180.         {    /* Call readProc directly because buffer is not set up */
  2181.             result = (*metafile->procsRec.readProc) (metafile->userFilePtr,
  2182.                     sizeof(MF3DObjType), (char *)objType);
  2183.     
  2184.             if (result == kMF3DErrReadFailedEOF)
  2185.                 result = kMF3DNoMoreObjects;
  2186.     
  2187.             if (result == kMF3DNoErr)
  2188.             {    result = (*metafile->procsRec.readProc) (metafile->userFilePtr,
  2189.                         sizeof(MF3DUns32), (char *) &objectSize);
  2190.             }
  2191.         }
  2192.         else
  2193.         {    /* Buffer already exists because we are in a container or group.
  2194.              * Use normal read routines.
  2195.              */
  2196.             result = MF3D_BinaryReadProc(metafile, sizeof(MF3DObjType),
  2197.                     (char *)objType);
  2198.     
  2199.             if (result == kMF3DNoErr)
  2200.             {    result = MF3D_BinaryReadProc(metafile, sizeof(MF3DUns32),
  2201.                         (char *) &objectSize);
  2202.             }
  2203.         }
  2204.     }
  2205.  
  2206.     if (result == kMF3DNoErr)
  2207.         result = MF3D_FindObjectFromType(*objType, objStuff);
  2208.  
  2209.     /* Get refID if in TOC */
  2210.     if (result == kMF3DNoErr)
  2211.         result = MF3D_GetBinaryRefID(metafile, location, refID);
  2212.  
  2213.     if (result == kMF3DNoErr)
  2214.     {    if (metafile->readBuffer.buf == NULL)
  2215.         {    /* Allocate the readBuffer */
  2216.             readBuffer = MF3D_Malloc(objectSize);
  2217.             if (readBuffer == NULL)
  2218.                 result = kMF3DErrOutOfMemory;
  2219.  
  2220.             if (result == kMF3DNoErr)
  2221.             {    result = (*metafile->procsRec.readProc)
  2222.                         (metafile->userFilePtr, objectSize, readBuffer);
  2223.             }
  2224.         
  2225.             if (result == kMF3DNoErr)
  2226.             {    MFASSERT(metafile->readBuffer.buf == NULL);
  2227.                 metafile->readBuffer.buf = readBuffer;
  2228.                 metafile->readBuffer.bufPos = 0;
  2229.                 metafile->readBuffer.bufSize = objectSize;
  2230.                 metafile->readBuffer.saveSize = NULL;
  2231.             }
  2232.         }
  2233.         else
  2234.         {    /* Inside a container, readBuffer already allocated.
  2235.              * So, we need to save the current buffer size and
  2236.              * shrink apparent size of the buffer to size the new object.
  2237.              */
  2238.             MF3D_SaveBufferPtr    sizeStack;
  2239.  
  2240.             MF3D_Allocate(sizeStack);
  2241.  
  2242.             if (result == kMF3DNoErr)
  2243.             {    /* Save size of parent */
  2244.                 sizeStack->bufSize = metafile->readBuffer.bufSize;
  2245.                 sizeStack->next = metafile->readBuffer.saveSize;
  2246.  
  2247.                 /* Validate the new buffer size */
  2248.                 if ((metafile->readBuffer.bufPos + objectSize) >
  2249.                         sizeStack->bufSize)
  2250.                 {    result = kMF3DErrContainedObjTooBig;
  2251.                 }
  2252.  
  2253.                 /* Set new (temporary) buffer size */
  2254.                 if (result == kMF3DNoErr)
  2255.                 {    metafile->readBuffer.bufSize = metafile->readBuffer.bufPos +
  2256.                             objectSize;
  2257.                     metafile->readBuffer.saveSize = sizeStack;
  2258.                 }
  2259.             }
  2260.         }
  2261.     }
  2262.  
  2263.     return result;
  2264. }
  2265.  
  2266. /*==============================================================================
  2267.  *    MF3D_BeginReadT
  2268.  *
  2269.  *    Begin reading a text object: read name and open paren
  2270.  *
  2271.  *    Return
  2272.  *        kMF3DNoErr            if an object is successfully read
  2273.  *        kMF3DNoMoreObjects    if a close parenthesis was read
  2274.  *        any other error        if an error occurs during parsing
  2275.  *==============================================================================
  2276.  */
  2277. MF3DErr
  2278. MF3D_BeginReadT(
  2279.     MF3D_FilePtr        metafile,
  2280.     MF3D_ObjStuffPtr    *objStuff,
  2281.     MF3DReferenceID        *refID,
  2282.     MF3DObjType            *objType)
  2283. {
  2284.     MF3DUns32                    objIndex, numObjTableEntries;
  2285.     MF3D_ObjectTableEntryPtr    objTableEntryPtr;
  2286.     MF3DBinaryFilePosition        curPos;
  2287.     char                        *readBuffer;
  2288.     MF3DUns32                    objectSize;
  2289.     MF3DErr                        result;
  2290.  
  2291.     /* Find out where we are */
  2292.     result = MF3DTellPosition(metafile, &curPos);
  2293.  
  2294.     /* Find curPos in the objTable */
  2295.     numObjTableEntries = metafile->objTable.numObjects;
  2296.     objTableEntryPtr = metafile->objTable.objects;
  2297.     for (objIndex = 0; objIndex < numObjTableEntries;
  2298.             ++objIndex, ++objTableEntryPtr)
  2299.     {    /* Find the first position >= curPos.
  2300.          * That will be the beginning of the object.
  2301.          */
  2302.         if (CompareInt64(objTableEntryPtr->objLocation, curPos) >= 0)
  2303.             break;
  2304.     }
  2305.     if (objIndex >= numObjTableEntries)
  2306.         result = kMF3DNoMoreObjects;
  2307.  
  2308.     MFASSERT(result == kMF3DNoMoreObjects ||
  2309.             CompareInt64(objTableEntryPtr->objLocation, curPos) == 0);
  2310.  
  2311.     /* Create read buffer */
  2312.     if (result == kMF3DNoErr && metafile->readBuffer.buf == NULL)
  2313.     {    /* ###NOTE###
  2314.          * Objects must be no bigger than an Uns32 for this subtract
  2315.          * to work. (If we have that much data, our malloc is probably
  2316.          * going to fail anyway.)
  2317.          */
  2318.         objectSize = SubtractUns64(objTableEntryPtr[1].objLocation, curPos);
  2319.         readBuffer = MF3D_Malloc(objectSize + 1);
  2320.         if (readBuffer == NULL)
  2321.             result = kMF3DErrOutOfMemory;
  2322.  
  2323.         if (result == kMF3DNoErr)
  2324.         {    result = (*metafile->procsRec.readProc)
  2325.                     (metafile->userFilePtr, objectSize, readBuffer);
  2326.         }
  2327.  
  2328.         /* Setup the read buffer (if we were not called from IntObjectRead) */
  2329.         if (result == kMF3DNoErr)
  2330.         {    metafile->readBuffer.buf = readBuffer;
  2331.             metafile->readBuffer.buf[objectSize] = '\0';
  2332.             metafile->readBuffer.bufPos = 0;
  2333.             metafile->readBuffer.saveSize = NULL;
  2334. #if defined(DEBUG) && DEBUG > 0
  2335.             metafile->readBuffer.bufSize = objectSize;
  2336. #endif
  2337.         }
  2338.     }
  2339.  
  2340.     /* If this object had a label, we need to skip past it */
  2341.     if (result == kMF3DNoErr)
  2342.     {    *refID = objTableEntryPtr->objRefID;
  2343.         if (*refID > 0)
  2344.         {    result = MF3D_SkipText(metafile);
  2345.         }
  2346.     }
  2347.  
  2348.     /* Read object name and translate to signature */
  2349.     if (result == kMF3DNoErr)
  2350.         result = MF3D_ReadObjectStuff(metafile, objStuff, objType);
  2351.  
  2352.     /* Read open paren */
  2353.     if (result == kMF3DNoErr)
  2354.         result = MF3D_ReadOpenParen(metafile);
  2355.  
  2356.     return result;
  2357. }
  2358.  
  2359. /*==============================================================================
  2360.  *    MF3D_BeginWriteB
  2361.  *
  2362.  *    Write object name and allot room for object size
  2363.  *==============================================================================
  2364.  */
  2365. MF3DErr
  2366. MF3D_BeginWriteB(
  2367.     MF3D_FilePtr        metafile,
  2368.     MF3DVoidObjPtr        object,
  2369.     MF3D_ObjStuffPtr    *objStuff)
  2370. {
  2371.     MF3D_WriteStackPtr    wsPtr;
  2372.     MF3DErr                result;
  2373.  
  2374.     /* Get objStuff and write the object type */
  2375.     result = MF3D_ObjTypeWrite(metafile, object, objStuff);
  2376.  
  2377.     if (result == kMF3DNoErr && object->objectType != kMF3DObjEndContainer)
  2378.     {    /* Allocate write stack link */
  2379.         MF3D_Allocate(wsPtr);
  2380.  
  2381.         /* Remember the location for the object size */
  2382.         if (result == kMF3DNoErr)
  2383.             result = MF3DTellPosition(metafile, &wsPtr->location);
  2384.     
  2385.         /* Write the phony object size */
  2386.         if (result == kMF3DNoErr)
  2387.             result = MF3D_Uns32Write(metafile, 0L);
  2388.     
  2389.         if (result == kMF3DNoErr)
  2390.         {    wsPtr->next = metafile->writeStack;
  2391.             metafile->writeStack = wsPtr;
  2392.         }
  2393.         else
  2394.             MF3D_Free(wsPtr);
  2395.     }
  2396.  
  2397.     return result;
  2398. }
  2399.  
  2400. /*==============================================================================
  2401.  *    MF3D_BeginWriteT
  2402.  *
  2403.  *    Write the object name and opening parenthesis
  2404.  *==============================================================================
  2405.  */
  2406. MF3DErr
  2407. MF3D_BeginWriteT(
  2408.     MF3D_FilePtr        metafile,
  2409.     MF3DVoidObjPtr        object,
  2410.     MF3D_ObjStuffPtr    *objStuff)
  2411. {
  2412.     MF3DErr                        result;
  2413.  
  2414.     result = kMF3DNoErr;
  2415.  
  2416.     /* Write the object type */
  2417.     result = MF3D_ObjTypeWrite(metafile, object, objStuff);
  2418.  
  2419.     /* Write the opening paren */
  2420.     if (result == kMF3DNoErr && object->objectType != kMF3DObjEndContainer)
  2421.     {    ++metafile->indent;
  2422.         result = MF3D_WriteProc(metafile, strlen(kMF3D_BeginCharStr " "),
  2423.                 kMF3D_BeginCharStr " ");
  2424.     }
  2425.  
  2426.     return result;
  2427. }
  2428.  
  2429. /*==============================================================================
  2430.  *    I/O Primitive Routines
  2431.  *    End Object
  2432.  *==============================================================================
  2433.  */
  2434. MF3DErr
  2435. MF3D_EndReadB(
  2436.     MF3D_FilePtr    metafile)
  2437. {
  2438.     MF3DUns32    bufPos;
  2439.     MF3DErr        result;
  2440.  
  2441.     MFASSERT(metafile->readBuffer.buf != NULL);
  2442.  
  2443.     result = kMF3DNoErr;
  2444.  
  2445.     /* Binary file objects are supposed to be padded to four-byte boundaries */
  2446.     bufPos = metafile->readBuffer.bufPos;
  2447.     if ((metafile->readBuffer.bufSize & 0x00000003) == 0)
  2448.         bufPos = (bufPos + 3) & (~0x00000003);
  2449.  
  2450.     if (bufPos != metafile->readBuffer.bufSize)
  2451.         result = kMF3DErrDidntReadEntireObj;
  2452.  
  2453.     if (result == kMF3DNoErr)
  2454.     {    if (metafile->readBuffer.saveSize != NULL)
  2455.         {    /* If saveSize exists, we are inside a container/group.
  2456.              * We need to expand the buffer size to the parent object again.
  2457.              */
  2458.             MF3D_SaveBufferPtr    sizeStack;
  2459.     
  2460.             sizeStack = metafile->readBuffer.saveSize;
  2461.             metafile->readBuffer.bufSize = sizeStack->bufSize;
  2462.             metafile->readBuffer.saveSize = sizeStack->next;
  2463.             MF3D_Free(sizeStack);
  2464.         }
  2465.         else
  2466.         {    /* If there was no saveSize, then we have reached the end
  2467.              * of a top-level object, and we can free the readBuffer.
  2468.              */
  2469.             MF3D_Free(metafile->readBuffer.buf);
  2470.             metafile->readBuffer.buf = NULL;
  2471.         }
  2472.     }
  2473.  
  2474.     return result;
  2475. }
  2476.  
  2477. MF3DErr
  2478. MF3D_EndReadT(
  2479.     MF3D_FilePtr    metafile)
  2480. {
  2481.     char    closeParen[2];
  2482.     MF3DErr    result;
  2483.  
  2484.     result = MF3D_ScanTextBuffer(metafile, "%1[" kMF3D_EndCharStr "]",
  2485.             closeParen);
  2486.  
  2487.     if (result == kMF3DNoErr)
  2488.     {    MF3D_SkipWhitespace(metafile);
  2489.         /* If we have reached the end of the object, free the buffer */
  2490.         if (metafile->readBuffer.buf[metafile->readBuffer.bufPos] == '\0')
  2491.         {    MFASSERT(metafile->readBuffer.bufPos ==
  2492.                     metafile->readBuffer.bufSize);
  2493.             MF3D_Free(metafile->readBuffer.buf);
  2494.             metafile->readBuffer.buf = NULL;
  2495.         }
  2496.     }
  2497.  
  2498.     return result;
  2499. }
  2500.  
  2501. /*==============================================================================
  2502.  *    MF3D_EndWriteB
  2503.  *
  2504.  *    Now that we know the object size, patch it back into the top of the
  2505.  *    object structure
  2506.  *==============================================================================
  2507.  */
  2508. MF3DErr
  2509. MF3D_EndWriteB(
  2510.     MF3D_FilePtr    metafile)
  2511. {
  2512.     MF3D_WriteStackPtr        writeStackPtr;
  2513.     MF3DBinaryFilePosition    curPos;
  2514.     MF3DSize                size;
  2515.     MF3DSize                padding;
  2516.     MF3DErr                    result;
  2517.  
  2518.     result = kMF3DNoErr;
  2519.  
  2520.     writeStackPtr = metafile->writeStack;
  2521.  
  2522.     if (writeStackPtr == NULL)
  2523.         result = kMF3DErrTooManyEndContainers;
  2524.  
  2525.     if (result == kMF3DNoErr)
  2526.         result = MF3DTellPosition(metafile, &curPos);
  2527.  
  2528.     if (result == kMF3DNoErr)
  2529.         result = MF3DSeekPosition(metafile, writeStackPtr->location);
  2530.  
  2531.     if (result == kMF3DNoErr)
  2532.     {    size = SubtractUns64(curPos, writeStackPtr->location);
  2533.         size -= sizeof(MF3DSize);
  2534.  
  2535.         /* Binary objects are padded to four-byte boundaries */
  2536.         padding = 3 - (size + 3) % 4;
  2537.         
  2538.         result = MF3D_Uns32Write(metafile, size + padding);
  2539.     }
  2540.  
  2541.     if (result == kMF3DNoErr)
  2542.         result = MF3DSeekPosition(metafile, curPos);
  2543.  
  2544.     if (result == kMF3DNoErr)
  2545.     {    /* Pad the object as required */
  2546.         if (padding > 0)
  2547.         {    MF3DUns32    zero;
  2548.  
  2549.             zero = 0;
  2550.             result = MF3D_WriteProc(metafile, padding, &zero);
  2551.         }
  2552.     }
  2553.  
  2554.     if (result == kMF3DNoErr)
  2555.     {    metafile->writeStack = writeStackPtr->next;
  2556.         MF3D_Free(writeStackPtr);
  2557.     }
  2558.  
  2559.     return result;
  2560. }
  2561.  
  2562. /*==============================================================================
  2563.  *    MF3D_EndWriteT
  2564.  *
  2565.  *    Just write a closing parenthesis
  2566.  *==============================================================================
  2567.  */
  2568. MF3DErr
  2569. MF3D_EndWriteT(
  2570.     MF3D_FilePtr    metafile)
  2571. {
  2572.     MF3DErr    result;
  2573.  
  2574.     result = kMF3DNoErr;
  2575.  
  2576.     if (metafile->indent > 0)
  2577.         --metafile->indent;
  2578.     else
  2579.         result = kMF3DErrTooManyEndContainers;
  2580.  
  2581.     if (result == kMF3DNoErr)
  2582.     {    result = MF3D_WriteProc(metafile, strlen(kMF3D_EndCharStr " "),
  2583.                 kMF3D_EndCharStr " ");
  2584.     }
  2585.  
  2586.     return result;
  2587. }
  2588.  
  2589. /*==============================================================================
  2590.  *    MF3D_ObjTypeReadB
  2591.  *
  2592.  *    Read the objectType
  2593.  *==============================================================================
  2594.  */
  2595. MF3DErr
  2596. MF3D_ObjTypeReadB(
  2597.     MF3D_FilePtr        metafile,
  2598.     MF3D_ObjStuffPtr    *objStuff,
  2599.     MF3DObjType            *objType)
  2600. {
  2601.     MF3DErr    result;
  2602.     result = MF3D_BinaryReadProc(metafile, sizeof(MF3DObjType), (char *)objType);
  2603.  
  2604.     if (result == kMF3DNoErr && objStuff != NULL)
  2605.         result = MF3D_FindObjectFromType(*objType, objStuff);
  2606.  
  2607.     return result;
  2608. }
  2609.  
  2610. /*==============================================================================
  2611.  *    MF3D_ObjTypeReadBS
  2612.  *
  2613.  *    Read the objectType and unswap
  2614.  *==============================================================================
  2615.  */
  2616. MF3DErr
  2617. MF3D_ObjTypeReadBS(
  2618.     MF3D_FilePtr        metafile,
  2619.     MF3D_ObjStuffPtr    *objStuff,
  2620.     MF3DObjType            *objType)
  2621. {
  2622.     MF3DErr    result;
  2623.     result = MF3D_BinaryReadProc(metafile, sizeof(MF3DObjType), (char *)objType);
  2624.  
  2625.     if (result == kMF3DNoErr)
  2626.         MF3D_ByteSwap(sizeof(MF3DObjType), *objType);
  2627.  
  2628.     if (result == kMF3DNoErr)
  2629.         result = MF3D_FindObjectFromType(*objType, objStuff);
  2630.  
  2631.     return result;
  2632. }
  2633.  
  2634. /*==============================================================================
  2635.  *    MF3D_ObjTypeReadT
  2636.  *
  2637.  *    Read the object name and convert it to an objectType.
  2638.  *==============================================================================
  2639.  */
  2640. MF3DErr
  2641. MF3D_ObjTypeReadT(
  2642.     MF3D_FilePtr        metafile,
  2643.     MF3D_ObjStuffPtr    *objStuff,
  2644.     MF3DObjType            *objType)
  2645. {
  2646.     return MF3D_ReadObjectStuff(metafile, objStuff, objType);
  2647. }
  2648.  
  2649. /*==============================================================================
  2650.  *    MF3D_ObjTypeWriteB
  2651.  *
  2652.  *    Write the object type and return object stuff.
  2653.  *==============================================================================
  2654.  */
  2655. MF3DErr
  2656. MF3D_ObjTypeWriteB(
  2657.     MF3D_FilePtr        metafile,
  2658.     MF3DVoidObjPtr        object,
  2659.     MF3D_ObjStuffPtr    *objStuff)
  2660. {
  2661.     MF3DErr        result;
  2662.     MF3DObjType    objType;
  2663.  
  2664.     MFASSERT(sizeof(MF3DObjType) == sizeof(MF3DUns32));
  2665.  
  2666.     objType = object->objectType;
  2667.     result = MF3D_FindObjectFromType(objType, objStuff);
  2668.  
  2669.     if (result == kMF3DNoErr)
  2670.     {    if (objType == kMF3DObjUnknownType)
  2671.         {    result = MF3D_Uns32Write(metafile,
  2672.                     ((MF3DUnknownObjPtr)object)->realObjectType);
  2673.         }
  2674.         else
  2675.         {    /* If we have a writeable type, spit it out */
  2676.             if ((*objStuff)->name != NULL)
  2677.                 result = MF3D_Uns32Write(metafile, objType);
  2678.         }
  2679.     }
  2680.  
  2681.     return result;
  2682. }
  2683.  
  2684. /*==============================================================================
  2685.  *    MF3D_ObjTypeWriteT
  2686.  *
  2687.  *    Write the object name and return object stuff.
  2688.  *==============================================================================
  2689.  */
  2690. MF3DErr
  2691. MF3D_ObjTypeWriteT(
  2692.     MF3D_FilePtr        metafile,
  2693.     MF3DVoidObjPtr        object,
  2694.     MF3D_ObjStuffPtr    *objStuff)
  2695. {
  2696.     MF3DErr        result;
  2697.  
  2698.     result = MF3D_FindObjectFromType(object->objectType, objStuff);
  2699.  
  2700.     if (result == kMF3DNoErr)
  2701.     {    if (object->objectType == kMF3DObjUnknownType)
  2702.         {    result = MF3D_Int32Write(metafile,
  2703.                     ((MF3DUnknownObjPtr)object)->realObjectType);
  2704.         }
  2705.         else if ((*objStuff)->name != NULL)
  2706.         {    MF3D_ValidateWriteSize(metafile, strlen(data) + 1);
  2707.             result = MF3D_OutputText(metafile, "%s ", (*objStuff)->name);
  2708.         }
  2709.     }
  2710.  
  2711.     return result;
  2712. }
  2713.  
  2714. /*==============================================================================
  2715.  *    I/O Primitive Routines
  2716.  *    Reference
  2717.  *==============================================================================
  2718.  */
  2719. MF3DErr
  2720. MF3D_RefReadB(
  2721.     MF3D_FilePtr            metafile,
  2722.     MF3DPositionReference    *data)
  2723. {
  2724.     MF3DErr    result;
  2725.  
  2726.     result = MF3D_Uns64Read(metafile, &data->location.binary);
  2727.  
  2728.     return result;
  2729. }
  2730.  
  2731. MF3DErr
  2732. MF3D_RefReadT(
  2733.     MF3D_FilePtr            metafile,
  2734.     MF3DPositionReference    *data)
  2735. {
  2736.     return MF3D_ReadTextLabel(metafile, &data->location.text);
  2737. }
  2738.  
  2739. MF3DErr
  2740. MF3D_TOCRefWriteB(
  2741.     MF3D_FilePtr                metafile,
  2742.     MF3DPositionReferencePtr    data)
  2743. {
  2744.     MF3DUns64    zero;
  2745.     MF3DErr        result;
  2746.  
  2747.     MF3D_Unused(data);
  2748.     
  2749.     /* Always write 0 and backpatch later */
  2750.     SetInt64ToZero(zero);
  2751.  
  2752.     /* If it is a binary file, we will want to update the location later */
  2753.     result = MF3DTellPosition(metafile, &metafile->tocLocation);
  2754.  
  2755.     if (result == kMF3DNoErr)
  2756.         result = MF3D_Uns64Write(metafile, zero);
  2757.  
  2758.     return result;
  2759. }
  2760.  
  2761. MF3DErr
  2762. MF3D_TOCRefWriteT(
  2763.     MF3D_FilePtr                metafile,
  2764.     MF3DPositionReferencePtr    data)
  2765. {
  2766.     MF3DErr    result;
  2767.  
  2768.     /* Rare pessimism */
  2769.     result = kMF3DErrOutOfMemory;
  2770.  
  2771.     MFASSERT(metafile->tocStuff.tocLabelName == NULL);
  2772.  
  2773.     if (data == NULL)
  2774.     {    /* Write "nextTOC>" */
  2775.         MF3D_ValidateWriteSize(metafile, strlen(kMF3D_NoTOCPtrStr
  2776.                 kMF3D_ReferencePtrStr " ") + 2);
  2777.         metafile->tocStuff.tocLabelName =
  2778.                 MF3D_DuplicateCString(kMF3D_NoTOCPtrStr);
  2779.     }
  2780.     else if (MF3DIsTextFormat(data->format))
  2781.     {    MF3D_ValidateWriteSize(metafile, strlen(data) + 2);
  2782.         metafile->tocStuff.tocLabelName =
  2783.                 MF3D_DuplicateCString(data->location.text);
  2784.     }
  2785.     else
  2786.     {    /* Write "toc>" */
  2787.         MF3D_ValidateWriteSize(metafile, strlen(kMF3D_DefaultTOCPtrStr
  2788.                 kMF3D_ReferencePtrStr " ") + 2);
  2789.         metafile->tocStuff.tocLabelName =
  2790.                 MF3D_DuplicateCString(kMF3D_DefaultTOCPtrStr);
  2791.     }
  2792.  
  2793.     if (metafile->tocStuff.tocLabelName != NULL)
  2794.     {    result = MF3D_OutputText(metafile, "%s" kMF3D_ReferencePtrStr " ",
  2795.                 metafile->tocStuff.tocLabelName);
  2796.     }
  2797.  
  2798.     return result;
  2799. }
  2800.  
  2801. MF3DErr
  2802. MF3D_RefWriteB(
  2803.     MF3D_FilePtr            metafile,
  2804.     MF3D_TOCPosition        data)
  2805. {
  2806.     return MF3D_Uns64Write(metafile, data.location);
  2807. }
  2808.  
  2809. MF3DErr
  2810. MF3D_RefWriteT(
  2811.     MF3D_FilePtr            metafile,
  2812.     MF3D_TOCPosition        data)
  2813. {
  2814.     MFASSERT(data.name != NULL);
  2815.  
  2816.     MF3D_ValidateWriteSize(metafile, strlen(data) + 2);
  2817.     return MF3D_OutputText(metafile, "%s" kMF3D_ReferencePtrStr " ",
  2818.             data.name);
  2819. }
  2820.  
  2821. MF3DErr
  2822. MF3D_LabelWriteB(
  2823.     MF3D_FilePtr                metafile,
  2824.     MF3DReferenceInfoPtr        data,
  2825.     MF3DBinaryFilePosition        location,
  2826.     MF3DObjType                    type)
  2827. {
  2828.     MF3D_TOCReferencePtr    refPtr;
  2829.     MF3DUns32                refCount;
  2830.     MF3DReferenceID            refID;
  2831.     MF3DErr                    result;
  2832.  
  2833.     result = kMF3DNoErr;
  2834.     refPtr = metafile->tocStuff.references;
  2835.     /* Subtract 1 because numReferences was already incremented
  2836.      * by MF3D_LabelWrite
  2837.      */
  2838.     refCount = metafile->tocStuff.numReferences - 1;
  2839.     refID = data->refID;
  2840.     while (result == kMF3DNoErr && refCount > 0)
  2841.     {    if (refPtr->refID == refID)
  2842.             result = kMF3DErrTwoObjectsWithSameRefID;
  2843.         ++refPtr;
  2844.         --refCount;
  2845.     }
  2846.  
  2847.     if (result == kMF3DNoErr)
  2848.     {    refPtr->refID = refID;
  2849.         refPtr->ref.location = location;
  2850.         refPtr->type = type;
  2851.     }
  2852.  
  2853.     return result;
  2854. }
  2855.  
  2856. MF3DErr
  2857. MF3D_LabelWriteT(
  2858.     MF3D_FilePtr                metafile,
  2859.     MF3DReferenceInfoPtr        data,
  2860.     MF3DBinaryFilePosition        location,
  2861.     MF3DObjType                    type)
  2862. {
  2863.     MF3D_TOCReferencePtr    refPtr;
  2864.     MF3DUns32                refCount;
  2865.     MF3DReferenceID            refID;
  2866.     MF3DCStringPtr            refNameString;
  2867.     MF3DErr                    result;
  2868.  
  2869.     MF3D_Unused(location);
  2870.     MF3D_Unused(type);
  2871.  
  2872.     result = kMF3DNoErr;
  2873.  
  2874.     if (data->refName != NULL)
  2875.     {    MF3D_ValidateWriteSize(metafile, strlen(kMF3D_LabelCharStr " ") +
  2876.                 strlen(data->refName));
  2877.         result = MF3D_OutputText(metafile, "%s" kMF3D_LabelCharStr " ",
  2878.                 data->refName);
  2879.         if (result == kMF3DNoErr)
  2880.             refNameString = MF3D_DuplicateCString(data->refName);
  2881.     }
  2882.     else
  2883.     {    /* If no label exists, make one up */
  2884.         MF3D_ValidateWriteSize(metafile, strlen(kMF3D_DefaultLabelStr "%ld"
  2885.                 kMF3D_LabelCharStr " "));
  2886.         result = MF3D_OutputText(metafile, kMF3D_DefaultLabelStr "%ld"
  2887.                 kMF3D_LabelCharStr " ", data->refID);
  2888.         if (result == kMF3DNoErr)
  2889.         {    refNameString = MF3D_Malloc(kMF3D_MaxDefaultLabelLen);
  2890.             if (refNameString == NULL)
  2891.                 result = kMF3DErrOutOfMemory;
  2892.         }
  2893.         if (result == kMF3DNoErr)
  2894.         {    int    numChars;
  2895.  
  2896.             numChars = sprintf(refNameString, kMF3D_DefaultLabelStr "%ld"
  2897.                     kMF3D_LabelCharStr, data->refID);
  2898.             MFASSERT(numChars < kMF3D_MaxDefaultLabelLen);
  2899.             refNameString = MF3D_Realloc(refNameString, numChars + 1);
  2900.         }
  2901.     }
  2902.  
  2903.     if (result == kMF3DNoErr)
  2904.     {    /* Write a newline here */
  2905.         MF3D_WriteNewLine(metafile);
  2906.  
  2907.         refPtr = metafile->tocStuff.references;
  2908.         /* Subtract 1 because numReferences was already incremented
  2909.          * by MF3D_LabelWrite
  2910.          */
  2911.         refCount = metafile->tocStuff.numReferences - 1;
  2912.         refID = data->refID;
  2913.         while (result == kMF3DNoErr && refCount > 0)
  2914.         {    if (refPtr->refID == refID)
  2915.             {    result = kMF3DErrTwoObjectsWithSameRefID;
  2916.             }
  2917.             else if (MF3D_CmpStrInsensitive(refPtr->ref.name, refNameString) == 0)
  2918.             {    result = kMF3DErrTwoObjectsWithSameRefName;
  2919.             }
  2920.             ++refPtr;
  2921.             --refCount;
  2922.         }
  2923.  
  2924.         if (result == kMF3DNoErr)
  2925.         {    refPtr->refID = refID;
  2926.             refPtr->ref.name = refNameString;
  2927.             refPtr->type = type;
  2928.         }
  2929.         else
  2930.             MF3D_Free(refNameString);
  2931.     }
  2932.  
  2933.     return result;
  2934. }
  2935.  
  2936. /*==============================================================================
  2937.  *    Basic 3-D Types
  2938.  *    2-D Point
  2939.  *==============================================================================
  2940.  */
  2941. MF3DErr
  2942. MF3D_Point2DRead(
  2943.     MF3D_FilePtr        metafile,
  2944.     MF3DPoint2D            *point)
  2945. {
  2946.     MF3DErr    result;
  2947.  
  2948.     result = MF3D_Float32Read(metafile, &point->x);
  2949.  
  2950.     if (result == kMF3DNoErr)
  2951.         result = MF3D_Float32Read(metafile, &point->y);
  2952.  
  2953.     return result;
  2954. }
  2955.  
  2956. MF3DErr
  2957. MF3D_Point2DWrite(
  2958.     MF3D_FilePtr        metafile,
  2959.     const MF3DPoint2D    point)
  2960. {
  2961.     MF3DErr    result;
  2962.  
  2963.     result = MF3D_Float32Write(metafile, point.x);
  2964.  
  2965.     if (result == kMF3DNoErr)
  2966.         result = MF3D_Float32Write(metafile, point.y);
  2967.  
  2968.     return result;
  2969. }
  2970.  
  2971. /*==============================================================================
  2972.  *    Basic 3-D Types
  2973.  *    3-D Point
  2974.  *==============================================================================
  2975.  */
  2976. MF3DErr
  2977. MF3D_Point3DRead(
  2978.     MF3D_FilePtr        metafile,
  2979.     MF3DPoint3D            *point)
  2980. {
  2981.     MF3DErr    result;
  2982.  
  2983.     result = MF3D_Float32Read(metafile, &point->x);
  2984.  
  2985.     if (result == kMF3DNoErr)
  2986.         result = MF3D_Float32Read(metafile, &point->y);
  2987.  
  2988.     if (result == kMF3DNoErr)
  2989.         result = MF3D_Float32Read(metafile, &point->z);
  2990.  
  2991.     return result;
  2992. }
  2993.  
  2994. MF3DErr
  2995. MF3D_Point3DWrite(
  2996.     MF3D_FilePtr        metafile,
  2997.     const MF3DPoint3D    point)
  2998. {
  2999.     MF3DErr    result;
  3000.  
  3001.     result = MF3D_Float32Write(metafile, point.x);
  3002.  
  3003.     if (result == kMF3DNoErr)
  3004.         result = MF3D_Float32Write(metafile, point.y);
  3005.  
  3006.     if (result == kMF3DNoErr)
  3007.         result = MF3D_Float32Write(metafile, point.z);
  3008.  
  3009.     return result;
  3010. }
  3011.  
  3012. /*==============================================================================
  3013.  *    Basic 3-D Types
  3014.  *    Rational 3-D Point
  3015.  *==============================================================================
  3016.  */
  3017. MF3DErr
  3018. MF3D_RationalPoint3DRead(
  3019.     MF3D_FilePtr        metafile,
  3020.     MF3DRationalPoint3D    *point)
  3021. {
  3022.     MF3DErr    result;
  3023.  
  3024.     result = MF3D_Float32Read(metafile, &point->x);
  3025.  
  3026.     if (result == kMF3DNoErr)
  3027.         result = MF3D_Float32Read(metafile, &point->y);
  3028.  
  3029.     if (result == kMF3DNoErr)
  3030.         result = MF3D_Float32Read(metafile, &point->w);
  3031.  
  3032.     return result;
  3033. }
  3034.  
  3035. MF3DErr
  3036. MF3D_RationalPoint3DWrite(
  3037.     MF3D_FilePtr                metafile,
  3038.     const MF3DRationalPoint3D    point)
  3039. {
  3040.     MF3DErr    result;
  3041.  
  3042.     result = MF3D_Float32Write(metafile, point.x);
  3043.  
  3044.     if (result == kMF3DNoErr)
  3045.         result = MF3D_Float32Write(metafile, point.y);
  3046.  
  3047.     if (result == kMF3DNoErr)
  3048.         result = MF3D_Float32Write(metafile, point.w);
  3049.  
  3050.     return result;
  3051. }
  3052.  
  3053. /*==============================================================================
  3054.  *    Basic 3-D Types
  3055.  *    Rational 4-D Point
  3056.  *==============================================================================
  3057.  */
  3058. MF3DErr
  3059. MF3D_RationalPoint4DRead(
  3060.     MF3D_FilePtr        metafile,
  3061.     MF3DRationalPoint4D    *point)
  3062. {
  3063.     MF3DErr    result;
  3064.  
  3065.     result = MF3D_Float32Read(metafile, &point->x);
  3066.  
  3067.     if (result == kMF3DNoErr)
  3068.         result = MF3D_Float32Read(metafile, &point->y);
  3069.  
  3070.     if (result == kMF3DNoErr)
  3071.         result = MF3D_Float32Read(metafile, &point->z);
  3072.  
  3073.     if (result == kMF3DNoErr)
  3074.         result = MF3D_Float32Read(metafile, &point->w);
  3075.  
  3076.     return result;
  3077. }
  3078.  
  3079. MF3DErr
  3080. MF3D_RationalPoint4DWrite(
  3081.     MF3D_FilePtr                metafile,
  3082.     const MF3DRationalPoint4D    point)
  3083. {
  3084.     MF3DErr    result;
  3085.  
  3086.     result = MF3D_Float32Write(metafile, point.x);
  3087.  
  3088.     if (result == kMF3DNoErr)
  3089.         result = MF3D_Float32Write(metafile, point.y);
  3090.  
  3091.     if (result == kMF3DNoErr)
  3092.         result = MF3D_Float32Write(metafile, point.z);
  3093.  
  3094.     if (result == kMF3DNoErr)
  3095.         result = MF3D_Float32Write(metafile, point.w);
  3096.  
  3097.     return result;
  3098. }
  3099.  
  3100. /*==============================================================================
  3101.  *    Basic 3-D Types
  3102.  *    3-D Vector
  3103.  *==============================================================================
  3104.  */
  3105. MF3DErr
  3106. MF3D_Vector3DRead(
  3107.     MF3D_FilePtr        metafile,
  3108.     MF3DVector3D        *vector)
  3109. {
  3110.     MF3DErr    result;
  3111.  
  3112.     result = MF3D_Float32Read(metafile, &vector->x);
  3113.  
  3114.     if (result == kMF3DNoErr)
  3115.         result = MF3D_Float32Read(metafile, &vector->y);
  3116.  
  3117.     if (result == kMF3DNoErr)
  3118.         result = MF3D_Float32Read(metafile, &vector->z);
  3119.  
  3120.     return result;
  3121. }
  3122.  
  3123. MF3DErr
  3124. MF3D_Vector3DWrite(
  3125.     MF3D_FilePtr        metafile,
  3126.     const MF3DVector3D    vector)
  3127. {
  3128.     MF3DErr    result;
  3129.  
  3130.     result = MF3D_Float32Write(metafile, vector.x);
  3131.  
  3132.     if (result == kMF3DNoErr)
  3133.         result = MF3D_Float32Write(metafile, vector.y);
  3134.  
  3135.     if (result == kMF3DNoErr)
  3136.         result = MF3D_Float32Write(metafile, vector.z);
  3137.  
  3138.     return result;
  3139. }
  3140.  
  3141. /*==============================================================================
  3142.  *    Basic 3-D Types
  3143.  *    Quaternion
  3144.  *==============================================================================
  3145.  */
  3146. MF3DErr
  3147. MF3D_QuaternionRead(
  3148.     MF3D_FilePtr        metafile,
  3149.     MF3DQuaternion        *quaternion)
  3150. {
  3151.     MF3DErr    result;
  3152.  
  3153.     result = MF3D_Float32Read(metafile, &quaternion->w);
  3154.  
  3155.     if (result == kMF3DNoErr)
  3156.         result = MF3D_Float32Read(metafile, &quaternion->x);
  3157.  
  3158.     if (result == kMF3DNoErr)
  3159.         result = MF3D_Float32Read(metafile, &quaternion->y);
  3160.  
  3161.     if (result == kMF3DNoErr)
  3162.         result = MF3D_Float32Read(metafile, &quaternion->z);
  3163.  
  3164.     return result;
  3165. }
  3166.  
  3167. MF3DErr
  3168. MF3D_QuaternionWrite(
  3169.     MF3D_FilePtr            metafile,
  3170.     const MF3DQuaternion    quaternion)
  3171. {
  3172.     MF3DErr    result;
  3173.  
  3174.     result = MF3D_Float32Write(metafile, quaternion.w);
  3175.  
  3176.     if (result == kMF3DNoErr)
  3177.         result = MF3D_Float32Write(metafile, quaternion.x);
  3178.  
  3179.     if (result == kMF3DNoErr)
  3180.         result = MF3D_Float32Write(metafile, quaternion.y);
  3181.  
  3182.     if (result == kMF3DNoErr)
  3183.         result = MF3D_Float32Write(metafile, quaternion.z);
  3184.  
  3185.     return result;
  3186. }
  3187.  
  3188. /*==============================================================================
  3189.  *    Basic 3-D Types
  3190.  *    3x3 Matrix
  3191.  *==============================================================================
  3192.  */
  3193. MF3DErr
  3194. MF3D_Matrix3x3Read(
  3195.     MF3D_FilePtr        metafile,
  3196.     MF3DMatrix3x3        matrix)
  3197. {
  3198.     MF3DErr    result;
  3199.  
  3200.     result = MF3D_Float32Read(metafile, &matrix[0][0]);
  3201.     if (result == kMF3DNoErr)
  3202.         result = MF3D_Float32Read(metafile, &matrix[0][1]);
  3203.     if (result == kMF3DNoErr)
  3204.         result = MF3D_Float32Read(metafile, &matrix[0][2]);
  3205.     if (result == kMF3DNoErr)
  3206.         result = MF3D_Float32Read(metafile, &matrix[1][0]);
  3207.     if (result == kMF3DNoErr)
  3208.         result = MF3D_Float32Read(metafile, &matrix[1][1]);
  3209.     if (result == kMF3DNoErr)
  3210.         result = MF3D_Float32Read(metafile, &matrix[1][2]);
  3211.     if (result == kMF3DNoErr)
  3212.         result = MF3D_Float32Read(metafile, &matrix[2][0]);
  3213.     if (result == kMF3DNoErr)
  3214.         result = MF3D_Float32Read(metafile, &matrix[2][1]);
  3215.     if (result == kMF3DNoErr)
  3216.         result = MF3D_Float32Read(metafile, &matrix[2][2]);
  3217.  
  3218.     return result;
  3219. }
  3220.  
  3221. MF3DErr
  3222. MF3D_Matrix3x3Write(
  3223.     MF3D_FilePtr        metafile,
  3224.     const MF3DMatrix3x3    matrix)
  3225. {
  3226.     MF3DErr    result;
  3227.  
  3228.     result = MF3D_Float32Write(metafile, matrix[0][0]);
  3229.     if (result == kMF3DNoErr)
  3230.         result = MF3D_Float32Write(metafile, matrix[0][1]);
  3231.     if (result == kMF3DNoErr)
  3232.         result = MF3D_Float32Write(metafile, matrix[0][2]);
  3233.  
  3234.     if (result == kMF3DNoErr)
  3235.         MF3D_WriteNewLine(metafile);
  3236.  
  3237.     if (result == kMF3DNoErr)
  3238.         result = MF3D_Float32Write(metafile, matrix[1][0]);
  3239.     if (result == kMF3DNoErr)
  3240.         result = MF3D_Float32Write(metafile, matrix[1][1]);
  3241.     if (result == kMF3DNoErr)
  3242.         result = MF3D_Float32Write(metafile, matrix[1][2]);
  3243.  
  3244.     if (result == kMF3DNoErr)
  3245.         MF3D_WriteNewLine(metafile);
  3246.  
  3247.     if (result == kMF3DNoErr)
  3248.         result = MF3D_Float32Write(metafile, matrix[2][0]);
  3249.     if (result == kMF3DNoErr)
  3250.         result = MF3D_Float32Write(metafile, matrix[2][1]);
  3251.     if (result == kMF3DNoErr)
  3252.         result = MF3D_Float32Write(metafile, matrix[2][2]);
  3253.  
  3254.     if (result == kMF3DNoErr)
  3255.         MF3D_WriteNewLine(metafile);
  3256.  
  3257.     return result;
  3258. }
  3259.  
  3260. /*==============================================================================
  3261.  *    Basic 3-D Types
  3262.  *    4x4 Matrix
  3263.  *==============================================================================
  3264.  */
  3265. MF3DErr
  3266. MF3D_Matrix4x4Read(
  3267.     MF3D_FilePtr        metafile,
  3268.     MF3DMatrix4x4        matrix)
  3269. {
  3270.     MF3DErr    result;
  3271.  
  3272.     result = MF3D_Float32Read(metafile, &matrix[0][0]);
  3273.     if (result == kMF3DNoErr)
  3274.         result = MF3D_Float32Read(metafile, &matrix[0][1]);
  3275.     if (result == kMF3DNoErr)
  3276.         result = MF3D_Float32Read(metafile, &matrix[0][2]);
  3277.     if (result == kMF3DNoErr)
  3278.         result = MF3D_Float32Read(metafile, &matrix[0][3]);
  3279.     if (result == kMF3DNoErr)
  3280.         result = MF3D_Float32Read(metafile, &matrix[1][0]);
  3281.     if (result == kMF3DNoErr)
  3282.         result = MF3D_Float32Read(metafile, &matrix[1][1]);
  3283.     if (result == kMF3DNoErr)
  3284.         result = MF3D_Float32Read(metafile, &matrix[1][2]);
  3285.     if (result == kMF3DNoErr)
  3286.         result = MF3D_Float32Read(metafile, &matrix[1][3]);
  3287.     if (result == kMF3DNoErr)
  3288.         result = MF3D_Float32Read(metafile, &matrix[2][0]);
  3289.     if (result == kMF3DNoErr)
  3290.         result = MF3D_Float32Read(metafile, &matrix[2][1]);
  3291.     if (result == kMF3DNoErr)
  3292.         result = MF3D_Float32Read(metafile, &matrix[2][2]);
  3293.     if (result == kMF3DNoErr)
  3294.         result = MF3D_Float32Read(metafile, &matrix[2][3]);
  3295.     if (result == kMF3DNoErr)
  3296.         result = MF3D_Float32Read(metafile, &matrix[3][0]);
  3297.     if (result == kMF3DNoErr)
  3298.         result = MF3D_Float32Read(metafile, &matrix[3][1]);
  3299.     if (result == kMF3DNoErr)
  3300.         result = MF3D_Float32Read(metafile, &matrix[3][2]);
  3301.     if (result == kMF3DNoErr)
  3302.         result = MF3D_Float32Read(metafile, &matrix[3][3]);
  3303.  
  3304.     return result;
  3305. }
  3306.  
  3307. MF3DErr
  3308. MF3D_Matrix4x4Write(
  3309.     MF3D_FilePtr        metafile,
  3310.     const MF3DMatrix4x4    matrix)
  3311. {
  3312.     MF3DErr    result;
  3313.  
  3314.     result = MF3D_Float32Write(metafile, matrix[0][0]);
  3315.     if (result == kMF3DNoErr)
  3316.         result = MF3D_Float32Write(metafile, matrix[0][1]);
  3317.     if (result == kMF3DNoErr)
  3318.         result = MF3D_Float32Write(metafile, matrix[0][2]);
  3319.     if (result == kMF3DNoErr)
  3320.         result = MF3D_Float32Write(metafile, matrix[0][3]);
  3321.  
  3322.     if (result == kMF3DNoErr)
  3323.         MF3D_WriteNewLine(metafile);
  3324.  
  3325.     if (result == kMF3DNoErr)
  3326.         result = MF3D_Float32Write(metafile, matrix[1][0]);
  3327.     if (result == kMF3DNoErr)
  3328.         result = MF3D_Float32Write(metafile, matrix[1][1]);
  3329.     if (result == kMF3DNoErr)
  3330.         result = MF3D_Float32Write(metafile, matrix[1][2]);
  3331.     if (result == kMF3DNoErr)
  3332.         result = MF3D_Float32Write(metafile, matrix[1][3]);
  3333.  
  3334.     if (result == kMF3DNoErr)
  3335.         MF3D_WriteNewLine(metafile);
  3336.  
  3337.     if (result == kMF3DNoErr)
  3338.         result = MF3D_Float32Write(metafile, matrix[2][0]);
  3339.     if (result == kMF3DNoErr)
  3340.         result = MF3D_Float32Write(metafile, matrix[2][1]);
  3341.     if (result == kMF3DNoErr)
  3342.         result = MF3D_Float32Write(metafile, matrix[2][2]);
  3343.     if (result == kMF3DNoErr)
  3344.         result = MF3D_Float32Write(metafile, matrix[2][3]);
  3345.  
  3346.     if (result == kMF3DNoErr)
  3347.         MF3D_WriteNewLine(metafile);
  3348.  
  3349.     if (result == kMF3DNoErr)
  3350.         result = MF3D_Float32Write(metafile, matrix[3][0]);
  3351.     if (result == kMF3DNoErr)
  3352.         result = MF3D_Float32Write(metafile, matrix[3][1]);
  3353.     if (result == kMF3DNoErr)
  3354.         result = MF3D_Float32Write(metafile, matrix[3][2]);
  3355.     if (result == kMF3DNoErr)
  3356.         result = MF3D_Float32Write(metafile, matrix[3][3]);
  3357.  
  3358.     if (result == kMF3DNoErr)
  3359.         MF3D_WriteNewLine(metafile);
  3360.  
  3361.     return result;
  3362. }
  3363.  
  3364. /*==============================================================================
  3365.  *    Basic 3-D Types
  3366.  *    RGB Color
  3367.  *==============================================================================
  3368.  */
  3369. MF3DErr
  3370. MF3D_RGBColorRead(
  3371.     MF3D_FilePtr        metafile,
  3372.     MF3DRGBColor        *color)
  3373. {
  3374.     MF3DErr    result;
  3375.  
  3376.     result = MF3D_Float32Read(metafile, &color->red);
  3377.  
  3378.     if (result == kMF3DNoErr)
  3379.         result = MF3D_Float32Read(metafile, &color->green);
  3380.  
  3381.     if (result == kMF3DNoErr)
  3382.         result = MF3D_Float32Read(metafile, &color->blue);
  3383.  
  3384.     return result;
  3385. }
  3386.  
  3387. MF3DErr
  3388. MF3D_RGBColorWrite(
  3389.     MF3D_FilePtr        metafile,
  3390.     const MF3DRGBColor    color)
  3391. {
  3392.     MF3DErr    result;
  3393.  
  3394.     result = MF3D_Float32Write(metafile, color.red);
  3395.  
  3396.     if (result == kMF3DNoErr)
  3397.         result = MF3D_Float32Write(metafile, color.green);
  3398.  
  3399.     if (result == kMF3DNoErr)
  3400.         result = MF3D_Float32Write(metafile, color.blue);
  3401.  
  3402.     return result;
  3403. }
  3404.  
  3405. /*==============================================================================
  3406.  *    Basic 3-D Types
  3407.  *    2-D Parametrization
  3408.  *==============================================================================
  3409.  */
  3410. MF3DErr
  3411. MF3D_Param2DRead(
  3412.     MF3D_FilePtr        metafile,
  3413.     MF3DParam2D            *param)
  3414. {
  3415.     MF3DErr    result;
  3416.  
  3417.     result = MF3D_Float32Read(metafile, ¶m->u);
  3418.  
  3419.     if (result == kMF3DNoErr)
  3420.         result = MF3D_Float32Read(metafile, ¶m->v);
  3421.  
  3422.     return result;
  3423. }
  3424.  
  3425. MF3DErr
  3426. MF3D_Param2DWrite(
  3427.     MF3D_FilePtr        metafile,
  3428.     const MF3DParam2D    param)
  3429. {
  3430.     MF3DErr    result;
  3431.  
  3432.     result = MF3D_Float32Write(metafile, param.u);
  3433.  
  3434.     if (result == kMF3DNoErr)
  3435.         result = MF3D_Float32Write(metafile, param.v);
  3436.  
  3437.     return result;
  3438. }
  3439.  
  3440. /*==============================================================================
  3441.  *    Comment Routines
  3442.  *==============================================================================
  3443.  */
  3444. MF3DErr
  3445. MF3D_CommentStrWrite(
  3446.     MF3D_FilePtr        metafile,
  3447.     const char            *data)
  3448. {
  3449.     MF3DErr    result;
  3450.  
  3451.     result = kMF3DNoErr;
  3452.  
  3453.     if (MF3DIsTextFormat(metafile->dataFormat))
  3454.     {    MF3D_ValidateWriteSize(metafile, strlen(data) + 2);
  3455.         result = MF3D_OutputText(metafile, kMF3D_CommentLineStr " %s", data);
  3456.  
  3457.         if (result == kMF3DNoErr)
  3458.             result = MF3D_WriteNewLine(metafile);
  3459.     }
  3460.  
  3461.     return result;
  3462. }
  3463.  
  3464. MF3DErr
  3465. MF3D_CommentNumWrite(
  3466.     MF3D_FilePtr        metafile,
  3467.     const MF3DInt32        data)
  3468. {
  3469.     MF3DErr    result;
  3470.  
  3471.     result = kMF3DNoErr;
  3472.  
  3473.     if (MF3DIsTextFormat(metafile->dataFormat))
  3474.     {    MF3D_ValidateWriteSize(metafile, 2);
  3475.         result = MF3D_OutputText(metafile, kMF3D_CommentLineStr " ");
  3476.  
  3477.         if (result == kMF3DNoErr)
  3478.             result = MF3D_Int32Write(metafile, data);
  3479.  
  3480.         if (result == kMF3DNoErr)
  3481.             result = MF3D_WriteNewLine(metafile);
  3482.     }
  3483.  
  3484.     return result;
  3485. }
  3486.  
  3487. /*==============================================================================
  3488.  *    MF3D_PositionReferenceDisposer
  3489.  *
  3490.  *    Dispose a PositionReferencePtr
  3491.  *==============================================================================
  3492.  */
  3493. MF3DErr
  3494. MF3D_PositionReferenceDisposer(
  3495.     const MF3DPositionReferencePtr    inPosRef)
  3496. {
  3497.     if (inPosRef != NULL && MF3DIsTextFormat(inPosRef->format) &&
  3498.             inPosRef->location.text != NULL)
  3499.     {    MF3D_Free(inPosRef->location.text);
  3500.     }
  3501.  
  3502.     return kMF3DNoErr;
  3503. }
  3504.  
  3505. /*==============================================================================
  3506.  *    MF3D_VariableUnsRead
  3507.  *
  3508.  *    Read an unsigned number from a variable-sized array and store it into
  3509.  *    an Uns32.
  3510.  *==============================================================================
  3511.  */
  3512. MF3DErr
  3513. MF3D_VariableUnsRead(
  3514.     MF3D_FilePtr    inMetafilePtr,
  3515.     MF3DUns32        inMaxValue,
  3516.     MF3DUns32Ptr    outValue)
  3517. {
  3518.     MF3DErr    result;
  3519.  
  3520. #if kAllowVariableUns == TRUE
  3521.     if (inMaxValue >= 65536)
  3522. #endif
  3523.         result = MF3D_Uns32Read(inMetafilePtr, outValue);
  3524. #if kAllowVariableUns == TRUE
  3525.     else if (inMaxValue >= 256)
  3526.     {    MF3DUns16    tempValue;
  3527.         result = MF3D_Uns16Read(inMetafilePtr, &tempValue);
  3528.         if (result == kMF3DNoErr)
  3529.             *outValue = tempValue;
  3530.     }
  3531.     else
  3532.     {    MF3DUns8    tempValue;
  3533.         result = MF3D_Uns8Read(inMetafilePtr, &tempValue);
  3534.         if (result == kMF3DNoErr)
  3535.             *outValue = tempValue;
  3536.     }
  3537. #endif
  3538.  
  3539.     return result;
  3540. }
  3541.  
  3542. /*==============================================================================
  3543.  *    MF3D_VariableUnsWrite
  3544.  *
  3545.  *    Write an unsigned number to a variable-sized array.
  3546.  *==============================================================================
  3547.  */
  3548. MF3DErr
  3549. MF3D_VariableUnsWrite(
  3550.     MF3D_FilePtr    inMetafilePtr,
  3551.     MF3DUns32        inMaxValue,
  3552.     const MF3DUns32    inValue)
  3553. {
  3554.     MF3DErr    result;
  3555.  
  3556.     MFASSERT(inValue <= inMaxValue);
  3557.  
  3558. #if kAllowVariableUns == TRUE
  3559.     if (inMaxValue >= 65536)
  3560. #endif
  3561.         result = MF3D_Uns32Write(inMetafilePtr, inValue);
  3562. #if kAllowVariableUns == TRUE
  3563.     else if (inMaxValue >= 256)
  3564.         result = MF3D_Uns16Write(inMetafilePtr, (MF3DUns16)inValue);
  3565.     else
  3566.         result = MF3D_Uns8Write(inMetafilePtr, (MF3DUns8)inValue);
  3567. #endif
  3568.  
  3569.     return result;
  3570. }
  3571.